Inject context

pull/189/head
Alex Baker 10 years ago
parent 64d1700529
commit c461531194

@ -7,7 +7,6 @@ package com.todoroo.andlib.service;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
/** /**
* Singleton class to manage current application context * Singleton class to manage current application context
@ -51,14 +50,4 @@ public final class ContextManager {
public static String getString(int resId, Object... formatArgs) { public static String getString(int resId, Object... formatArgs) {
return context.getString(resId, formatArgs); return context.getString(resId, formatArgs);
} }
/**
* Convenience method to read resources
*
* @return resources object
*/
public static Resources getResources() {
return context.getResources();
}
} }

@ -5,6 +5,8 @@
*/ */
package com.todoroo.andlib.service; package com.todoroo.andlib.service;
import android.content.Context;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
@ -23,7 +25,7 @@ abstract public class AbstractDependencyInjector {
* Initialize list of injection variables. Special care must used when * Initialize list of injection variables. Special care must used when
* instantiating classes that themselves depend on dependency injection * instantiating classes that themselves depend on dependency injection
*/ */
protected void addInjectables() { protected void addInjectables(Context context) {
// your injectables here // your injectables here
} }
@ -32,8 +34,8 @@ abstract public class AbstractDependencyInjector {
/** /**
* Constructor * Constructor
*/ */
protected AbstractDependencyInjector() { protected AbstractDependencyInjector(Context context) {
addInjectables(); addInjectables(context);
} }
/** /**

@ -8,8 +8,6 @@ package com.todoroo.andlib.service;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.LinkedList; import java.util.LinkedList;
/** /**
* Simple Dependency Injection Service for Android. * Simple Dependency Injection Service for Android.
* <p> * <p>
@ -115,18 +113,11 @@ public class DependencyInjectionService {
injectors)); injectors));
} }
// --- default dependency injector
private class DefaultDependencyInjector extends AbstractDependencyInjector {
}
// --- static methods // --- static methods
private static DependencyInjectionService instance = null; private static DependencyInjectionService instance = null;
DependencyInjectionService() { DependencyInjectionService() {
// prevent instantiation
injectors.add(new DefaultDependencyInjector());
} }
/** /**

@ -11,6 +11,7 @@ public class TestDependencyInjector extends AbstractDependencyInjector {
private String name; private String name;
public TestDependencyInjector(String name) { public TestDependencyInjector(String name) {
super(null);
this.name = name; this.name = name;
} }

@ -23,16 +23,12 @@ import java.util.Locale;
*/ */
public class TodorooTestCase extends AndroidTestCase { public class TodorooTestCase extends AndroidTestCase {
static {
AstridDependencyInjector.initialize();
}
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
ContextManager.setContext(this.getContext()); ContextManager.setContext(this.getContext());
AstridDependencyInjector.reset(); AstridDependencyInjector.reset(getContext());
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
setLocale(Locale.ENGLISH); setLocale(Locale.ENGLISH);
} }

@ -5,6 +5,8 @@
*/ */
package com.todoroo.astrid.service; package com.todoroo.astrid.service;
import android.content.Context;
import com.todoroo.andlib.service.AbstractDependencyInjector; import com.todoroo.andlib.service.AbstractDependencyInjector;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
@ -27,15 +29,17 @@ import com.todoroo.astrid.tags.TagService;
import org.tasks.Broadcaster; import org.tasks.Broadcaster;
import org.tasks.filters.FilterCounter; import org.tasks.filters.FilterCounter;
import org.tasks.injection.Injector; import org.tasks.injection.TestInjector;
import org.tasks.injection.TasksModule;
import org.tasks.scheduling.RefreshScheduler; import org.tasks.scheduling.RefreshScheduler;
import org.tasks.widget.WidgetHelper; import org.tasks.widget.WidgetHelper;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.ObjectGraph; import dagger.Provides;
import static org.tasks.injection.TasksModule.ForApplication;
/** /**
* Astrid application dependency injector loads classes in Astrid with the * Astrid application dependency injector loads classes in Astrid with the
@ -54,6 +58,18 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
} }
) )
public static class TestModule { public static class TestModule {
private Context context;
public TestModule(Context context) {
this.context = context;
}
@Singleton
@Provides
@ForApplication
public Context getContext() {
return context;
}
} }
/** /**
@ -61,8 +77,6 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
*/ */
private static AstridDependencyInjector instance = null; private static AstridDependencyInjector instance = null;
private Injector injector;
@Inject Database database; @Inject Database database;
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@Inject TagDataDao tagDataDao; @Inject TagDataDao tagDataDao;
@ -95,18 +109,9 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
* instantiating classes that themselves depend on dependency injection * instantiating classes that themselves depend on dependency injection
*/ */
@Override @Override
protected void addInjectables() { protected void addInjectables(Context context) {
injector = new Injector() { new TestInjector(context)
ObjectGraph objectGraph = ObjectGraph.create(new TasksModule()); .inject(this, new TestModule(context));
@Override
public void inject(Object caller, Object... modules) {
objectGraph
.plus(modules)
.inject(caller);
}
};
injector.inject(this, new TestModule());
// com.todoroo.astrid.dao // com.todoroo.astrid.dao
injectables.put("database", database); injectables.put("database", database);
@ -148,38 +153,28 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
/** /**
* Install this service as the default Dependency Injector * Install this service as the default Dependency Injector
*/ */
public static void initialize() { private static void initialize(Context context) {
if(instance != null) { if(instance != null) {
return; return;
} }
synchronized(AstridDependencyInjector.class) { synchronized(AstridDependencyInjector.class) {
if(instance == null) { if(instance == null) {
instance = new AstridDependencyInjector(); instance = new AstridDependencyInjector(context);
} }
DependencyInjectionService.getInstance().addInjector(instance); DependencyInjectionService.getInstance().addInjector(instance);
} }
} }
public static void inject(Object caller) { AstridDependencyInjector(Context context) {
initialize();
DependencyInjectionService.getInstance().inject(caller);
}
AstridDependencyInjector() {
// prevent instantiation // prevent instantiation
super(); super(context);
} }
/** /**
* Flush dependency injection cache. Useful for unit tests. * Flush dependency injection cache. Useful for unit tests.
*/ */
public synchronized static void reset() { public synchronized static void reset(Context context) {
instance = null; instance = null;
initialize(); initialize(context);
}
public static Injector getInjector() {
initialize();
return instance.injector;
} }
} }

@ -0,0 +1,21 @@
package org.tasks.injection;
import android.content.Context;
import dagger.ObjectGraph;
public class TestInjector implements Injector {
ObjectGraph objectGraph;
public TestInjector(Context context) {
objectGraph = ObjectGraph.create(new TasksModule(context));
}
@Override
public void inject(Object caller, Object... modules) {
objectGraph
.plus(modules)
.inject(caller);
}
}

@ -44,7 +44,6 @@ import android.widget.ListView;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
@ -93,6 +92,8 @@ import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.injection.ActivityModule.ForActivity;
/** /**
* Primary activity for the Bente application. Shows a list of upcoming tasks * Primary activity for the Bente application. Shows a list of upcoming tasks
* and a user's coaches. * and a user's coaches.
@ -139,6 +140,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
@Inject UpgradeService upgradeService; @Inject UpgradeService upgradeService;
@Inject TaskListMetadataDao taskListMetadataDao; @Inject TaskListMetadataDao taskListMetadataDao;
@Inject SyncV2Service syncService; @Inject SyncV2Service syncService;
@Inject @ForActivity Context context;
protected Resources resources; protected Resources resources;
protected TaskAdapter taskAdapter = null; protected TaskAdapter taskAdapter = null;
@ -918,7 +920,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
} }
} }
} }
TimerPlugin.updateTimer(taskService, ContextManager.getContext(), task, false); TimerPlugin.updateTimer(taskService, context, task, false);
} }
public void refreshFilterCount() { public void refreshFilterCount() {
@ -1069,14 +1071,14 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
sortSort = sort; sortSort = sort;
if (always) { if (always) {
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(ContextManager.getContext()); SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(context);
if (publicPrefs != null) { if (publicPrefs != null) {
Editor editor = publicPrefs.edit(); Editor editor = publicPrefs.edit();
if (editor != null) { if (editor != null) {
editor.putInt(SortHelper.PREF_SORT_FLAGS, flags); editor.putInt(SortHelper.PREF_SORT_FLAGS, flags);
editor.putInt(SortHelper.PREF_SORT_SORT, sort); editor.putInt(SortHelper.PREF_SORT_SORT, sort);
editor.commit(); editor.commit();
TasksWidget.updateWidgets(ContextManager.getContext()); TasksWidget.updateWidgets(context);
} }
} }
} }
@ -1088,6 +1090,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
setUpTaskList(); setUpTaskList();
} }
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
log.error(e.getMessage(), e);
// TODO: Fragment got detached somehow (rare) // TODO: Fragment got detached somehow (rare)
} }
} }

@ -12,7 +12,6 @@ import android.content.Intent;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
@ -33,6 +32,8 @@ import java.util.LinkedHashSet;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import static org.tasks.injection.TasksModule.ForApplication;
/** /**
* Provides operations for working with alerts * Provides operations for working with alerts
* *
@ -45,11 +46,14 @@ public class AlarmService {
// --- data retrieval // --- data retrieval
public static final String IDENTIFIER = "alarms"; //$NON-NLS-1$ public static final String IDENTIFIER = "alarms"; //$NON-NLS-1$
private MetadataService metadataService;
private final MetadataService metadataService;
private final Context context;
@Inject @Inject
public AlarmService(MetadataService metadataService) { public AlarmService(MetadataService metadataService, @ForApplication Context context) {
this.metadataService = metadataService; this.metadataService = metadataService;
this.context = context;
} }
/** /**
@ -75,7 +79,6 @@ public class AlarmService {
metadata.add(item); metadata.add(item);
} }
final Context context = ContextManager.getContext();
final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
boolean changed = metadataService.synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY), new SynchronizeMetadataCallback() { boolean changed = metadataService.synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY), new SynchronizeMetadataCallback() {
@ -155,7 +158,6 @@ public class AlarmService {
} }
private PendingIntent pendingIntentForAlarm(Metadata alarm, long taskId) { private PendingIntent pendingIntentForAlarm(Metadata alarm, long taskId) {
Context context = ContextManager.getContext();
Intent intent = new Intent(context, Notifications.class); Intent intent = new Intent(context, Notifications.class);
intent.setAction("ALARM" + alarm.getId()); //$NON-NLS-1$ intent.setAction("ALARM" + alarm.getId()); //$NON-NLS-1$
intent.putExtra(Notifications.ID_KEY, taskId); intent.putExtra(Notifications.ID_KEY, taskId);
@ -175,7 +177,6 @@ public class AlarmService {
long taskId = alarm.getTask(); long taskId = alarm.getTask();
Context context = ContextManager.getContext();
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = pendingIntentForAlarm(alarm, taskId); PendingIntent pendingIntent = pendingIntentForAlarm(alarm, taskId);

@ -22,7 +22,6 @@ import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
@ -166,7 +165,7 @@ public class TasksXmlImporter {
} }
} finally { } finally {
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH);
ContextManager.getContext().sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
handler.post(new Runnable() { handler.post(new Runnable() {
@Override @Override
public void run() { public void run() {

@ -21,8 +21,6 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.data.TaskListMetadata; import com.todoroo.astrid.data.TaskListMetadata;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.provider.Astrid3ContentProvider;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -68,14 +66,6 @@ public class Database extends AbstractDatabase {
@Inject @Inject
public Database() { public Database() {
super();
addListener(new DatabaseUpdateListener() {
@Override
public void onDatabaseUpdated() {
Astrid2TaskProvider.notifyDatabaseModification();
Astrid3ContentProvider.notifyDatabaseModification();
}
});
} }
// --- implementation // --- implementation

@ -18,7 +18,6 @@ import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
@ -133,7 +132,6 @@ public class MetadataDao extends DatabaseDao<Metadata> {
Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false); Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false);
} }
} }
Astrid2TaskProvider.notifyDatabaseModification();
return state; return state;
} }

@ -60,7 +60,7 @@ public class GtasksFilterExposer extends BroadcastReceiver implements AstridFilt
values.put(GtasksMetadata.LIST_ID.name, list.getValue(GtasksList.REMOTE_ID)); values.put(GtasksMetadata.LIST_ID.name, list.getValue(GtasksList.REMOTE_ID));
values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW); values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW);
FilterWithCustomIntent filter = new FilterWithCustomIntent(listName, FilterWithCustomIntent filter = new FilterWithCustomIntent(listName,
ContextManager.getString(R.string.gtasks_FEx_title, listName), new QueryTemplate().join( context.getString(R.string.gtasks_FEx_title, listName), new QueryTemplate().join(
Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and( Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
TaskCriteria.notDeleted(), TaskCriteria.notDeleted(),

@ -7,6 +7,7 @@ package com.todoroo.astrid.gtasks;
import android.app.Activity; import android.app.Activity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
@ -14,7 +15,6 @@ import android.widget.TextView;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
@ -33,6 +33,8 @@ import org.tasks.R;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.injection.ActivityModule.ForActivity;
public class GtasksListFragment extends SubtasksListFragment { public class GtasksListFragment extends SubtasksListFragment {
public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$ public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$
@ -43,6 +45,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@Inject SyncV2Service syncService; @Inject SyncV2Service syncService;
@Inject @ForActivity Context context;
private StoreObject list; private StoreObject list;
@ -87,7 +90,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override @Override
public void run() { public void run() {
if (manual) { if (manual) {
ContextManager.getContext().sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH)); context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
} else { } else {
refresh(); refresh();
} }

@ -6,13 +6,14 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import static org.tasks.injection.TasksModule.ForApplication;
@Singleton @Singleton
public class GtasksScheduler { public class GtasksScheduler {
@ -20,10 +21,12 @@ public class GtasksScheduler {
private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L; private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L;
private final GtasksPreferenceService gtasksPreferenceService; private final GtasksPreferenceService gtasksPreferenceService;
private Context context;
@Inject @Inject
public GtasksScheduler(GtasksPreferenceService gtasksPreferenceService) { public GtasksScheduler(GtasksPreferenceService gtasksPreferenceService, @ForApplication Context context) {
this.gtasksPreferenceService = gtasksPreferenceService; this.gtasksPreferenceService = gtasksPreferenceService;
this.context = context;
} }
/** /**
@ -37,7 +40,6 @@ public class GtasksScheduler {
} catch(ClassCastException e) { } catch(ClassCastException e) {
Preferences.setStringFromInteger(gtasksPreferenceService.getSyncIntervalKey(), 0); Preferences.setStringFromInteger(gtasksPreferenceService.getSyncIntervalKey(), 0);
} }
Context context = ContextManager.getContext();
if(syncFrequencySeconds <= 0) { if(syncFrequencySeconds <= 0) {
unscheduleService(context); unscheduleService(context);
return; return;

@ -5,12 +5,12 @@
*/ */
package com.todoroo.astrid.gtasks.sync; package com.todoroo.astrid.gtasks.sync;
import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import com.google.api.services.tasks.model.Tasks; import com.google.api.services.tasks.model.Tasks;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
@ -52,6 +52,7 @@ import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import static org.tasks.date.DateTimeUtils.newDate; import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.injection.TasksModule.ForApplication;
@Singleton @Singleton
public class GtasksSyncV2Provider extends SyncV2Provider { public class GtasksSyncV2Provider extends SyncV2Provider {
@ -64,10 +65,12 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
private final GtasksListService gtasksListService; private final GtasksListService gtasksListService;
private final GtasksMetadataService gtasksMetadataService; private final GtasksMetadataService gtasksMetadataService;
private final GtasksTaskListUpdater gtasksTaskListUpdater; private final GtasksTaskListUpdater gtasksTaskListUpdater;
private Context context;
@Inject @Inject
public GtasksSyncV2Provider(TaskService taskService, MetadataService metadataService, StoreObjectDao storeObjectDao, GtasksPreferenceService gtasksPreferenceService, public GtasksSyncV2Provider(TaskService taskService, MetadataService metadataService, StoreObjectDao storeObjectDao, GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService, GtasksTaskListUpdater gtasksTaskListUpdater) { GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService,
GtasksTaskListUpdater gtasksTaskListUpdater, @ForApplication Context context) {
this.taskService = taskService; this.taskService = taskService;
this.metadataService = metadataService; this.metadataService = metadataService;
this.storeObjectDao = storeObjectDao; this.storeObjectDao = storeObjectDao;
@ -76,11 +79,12 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
this.gtasksListService = gtasksListService; this.gtasksListService = gtasksListService;
this.gtasksMetadataService = gtasksMetadataService; this.gtasksMetadataService = gtasksMetadataService;
this.gtasksTaskListUpdater = gtasksTaskListUpdater; this.gtasksTaskListUpdater = gtasksTaskListUpdater;
this.context = context;
} }
@Override @Override
public String getName() { public String getName() {
return ContextManager.getString(R.string.gtasks_GPr_header); return context.getString(R.string.gtasks_GPr_header);
} }
@Override @Override
@ -231,7 +235,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
private String getValidatedAuthToken() { private String getValidatedAuthToken() {
String authToken = gtasksPreferenceService.getToken(); String authToken = gtasksPreferenceService.getToken();
try { try {
authToken = GtasksTokenValidator.validateAuthToken(ContextManager.getContext(), authToken); authToken = GtasksTokenValidator.validateAuthToken(context, authToken);
if (authToken != null) { if (authToken != null) {
gtasksPreferenceService.setToken(authToken); gtasksPreferenceService.setToken(authToken);
} }

@ -18,7 +18,6 @@ import android.os.Bundle;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
@ -69,7 +68,7 @@ public class SyncActionHelper {
// --- boilerplate // --- boilerplate
public SyncActionHelper(SyncV2Service syncService, Activity activity, Fragment fragment) { public SyncActionHelper(SyncV2Service syncService, final Activity activity, Fragment fragment) {
this.syncService = syncService; this.syncService = syncService;
this.activity = activity; this.activity = activity;
this.fragment = fragment; this.fragment = fragment;
@ -77,7 +76,7 @@ public class SyncActionHelper {
R.id.progressBar, new Runnable() { R.id.progressBar, new Runnable() {
@Override @Override
public void run() { public void run() {
ContextManager.getContext().sendBroadcast( activity.sendBroadcast(
new Intent( new Intent(
AstridApiConstants.BROADCAST_EVENT_REFRESH)); AstridApiConstants.BROADCAST_EVENT_REFRESH));
} }

@ -11,10 +11,8 @@ import android.content.UriMatcher;
import android.database.Cursor; import android.database.Cursor;
import android.database.MatrixCursor; import android.database.MatrixCursor;
import android.net.Uri; import android.net.Uri;
import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
@ -25,6 +23,8 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TagService.Tag; import com.todoroo.astrid.tags.TagService.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.injection.InjectingContentProvider; import org.tasks.injection.InjectingContentProvider;
import java.math.BigInteger; import java.math.BigInteger;
@ -47,9 +47,7 @@ import dagger.Lazy;
*/ */
public class Astrid2TaskProvider extends InjectingContentProvider { public class Astrid2TaskProvider extends InjectingContentProvider {
private static final String TAG = "MessageProvider"; private static final Logger log = LoggerFactory.getLogger(Astrid2TaskProvider.class);
private static final boolean LOGD = false;
public static final String AUTHORITY = "org.tasks.tasksprovider"; public static final String AUTHORITY = "org.tasks.tasksprovider";
@ -85,8 +83,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
@Inject Lazy<TaskService> taskService; @Inject Lazy<TaskService> taskService;
@Inject Lazy<TagService> tagService; @Inject Lazy<TagService> tagService;
private static Context ctx = null;
static { static {
URI_MATCHER.addURI(AUTHORITY, "tasks", URI_TASKS); URI_MATCHER.addURI(AUTHORITY, "tasks", URI_TASKS);
URI_MATCHER.addURI(AUTHORITY, "tags", URI_TAGS); URI_MATCHER.addURI(AUTHORITY, "tags", URI_TAGS);
@ -94,10 +90,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
@Override @Override
public int delete(Uri uri, String selection, String[] selectionArgs) { public int delete(Uri uri, String selection, String[] selectionArgs) {
if (LOGD) {
Log.d(TAG, "delete");
}
return 0; return 0;
} }
@ -114,8 +106,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
@Override @Override
public boolean onCreate() { public boolean onCreate() {
super.onCreate(); super.onCreate();
ctx = getContext();
ContextManager.setContext(ctx);
return false; return false;
} }
@ -178,7 +168,7 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
TaskCriteria.isVisible())). TaskCriteria.isVisible())).
orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS)); orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS));
try { try {
int[] importanceColors = Task.getImportanceColors(ctx.getResources()); int[] importanceColors = Task.getImportanceColors(getContext().getResources());
Task task = new Task(); Task task = new Task();
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext(); cursor.moveToNext();
@ -206,11 +196,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
@Override @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if (LOGD) {
Log.d(TAG, "query");
}
Cursor cursor; Cursor cursor;
switch (URI_MATCHER.match(uri)) { switch (URI_MATCHER.match(uri)) {
@ -231,11 +216,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
@Override @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
if (LOGD) {
Log.d(TAG, "update");
}
switch (URI_MATCHER.match(uri)) { switch (URI_MATCHER.match(uri)) {
case URI_TASKS: case URI_TASKS:
@ -276,19 +256,11 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
} }
} }
public static void notifyDatabaseModification() { public static void notifyDatabaseModification(Context context) {
if (LOGD) {
Log.d(TAG, "notifyDatabaseModification");
}
if(ctx == null) {
ctx = ContextManager.getContext();
}
try { try {
ctx.getContentResolver().notifyChange(CONTENT_URI, null); context.getContentResolver().notifyChange(CONTENT_URI, null);
} catch (Exception e) { } catch (Exception e) {
// no context was available log.error(e.getMessage(), e);
} }
} }
} }

@ -8,6 +8,7 @@ package com.todoroo.astrid.provider;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentUris; import android.content.ContentUris;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher; import android.content.UriMatcher;
import android.database.Cursor; import android.database.Cursor;
import android.database.SQLException; import android.database.SQLException;
@ -18,7 +19,6 @@ import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
@ -394,8 +394,8 @@ public class Astrid3ContentProvider extends InjectingContentProvider {
// --- change listeners // --- change listeners
public static void notifyDatabaseModification() { public static void notifyDatabaseModification(Context context) {
ContentResolver cr = ContextManager.getContext().getContentResolver(); ContentResolver cr = context.getContentResolver();
cr.notifyChange(Task.CONTENT_URI, null); cr.notifyChange(Task.CONTENT_URI, null);
} }
} }

@ -50,6 +50,7 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.date.DateTimeUtils.currentTimeMillis; import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.injection.TasksModule.ForApplication;
public class Notifications extends InjectingBroadcastReceiver { public class Notifications extends InjectingBroadcastReceiver {
@ -82,6 +83,7 @@ public class Notifications extends InjectingBroadcastReceiver {
// --- instance variables // --- instance variables
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
@Inject @ForApplication Context context;
public static NotificationManager notificationManager = null; public static NotificationManager notificationManager = null;
private static boolean forceNotificationManager = false; private static boolean forceNotificationManager = false;
@ -187,7 +189,6 @@ public class Notifications extends InjectingBroadcastReceiver {
task.setSocialReminder(Task.REMINDER_SOCIAL_UNSEEN); task.setSocialReminder(Task.REMINDER_SOCIAL_UNSEEN);
taskDao.saveExisting(task); taskDao.saveExisting(task);
Context context = ContextManager.getContext();
String title = context.getString(R.string.app_name); String title = context.getString(R.string.app_name);
String text = reminder + " " + taskTitle; //$NON-NLS-1$ String text = reminder + " " + taskTitle; //$NON-NLS-1$
@ -209,12 +210,11 @@ public class Notifications extends InjectingBroadcastReceiver {
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
notifyIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_NOTIFICATION); notifyIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_NOTIFICATION);
requestNotification((int)id, notifyIntent, type, title, text, ringTimes); requestNotification(context, (int)id, notifyIntent, type, title, text, ringTimes);
return true; return true;
} }
private static void requestNotification(long taskId, Intent intent, int type, String title, String text, int ringTimes) { private static void requestNotification(Context context, long taskId, Intent intent, int type, String title, String text, int ringTimes) {
Context context = ContextManager.getContext();
Intent inAppNotify = new Intent(BROADCAST_IN_APP_NOTIFY); Intent inAppNotify = new Intent(BROADCAST_IN_APP_NOTIFY);
inAppNotify.putExtra(EXTRAS_NOTIF_ID, (int)taskId); inAppNotify.putExtra(EXTRAS_NOTIF_ID, (int)taskId);
inAppNotify.putExtra(NotificationFragment.TOKEN_ID, taskId); inAppNotify.putExtra(NotificationFragment.TOKEN_ID, taskId);
@ -225,7 +225,7 @@ public class Notifications extends InjectingBroadcastReceiver {
inAppNotify.putExtra(EXTRAS_RING_TIMES, ringTimes); inAppNotify.putExtra(EXTRAS_RING_TIMES, ringTimes);
if(forceNotificationManager) { if(forceNotificationManager) {
new ShowNotificationReceiver().onReceive(ContextManager.getContext(), inAppNotify); new ShowNotificationReceiver().onReceive(context, inAppNotify);
} else { } else {
context.sendOrderedBroadcast(inAppNotify, AstridApiConstants.PERMISSION_READ); context.sendOrderedBroadcast(inAppNotify, AstridApiConstants.PERMISSION_READ);
} }
@ -246,7 +246,7 @@ public class Notifications extends InjectingBroadcastReceiver {
String title = intent.getStringExtra(EXTRAS_TITLE); String title = intent.getStringExtra(EXTRAS_TITLE);
String text = intent.getStringExtra(EXTRAS_TEXT); String text = intent.getStringExtra(EXTRAS_TEXT);
int ringTimes = intent.getIntExtra(EXTRAS_RING_TIMES, 1); int ringTimes = intent.getIntExtra(EXTRAS_RING_TIMES, 1);
showNotification(notificationId, customIntent, type, title, text, ringTimes); showNotification(context, notificationId, customIntent, type, title, text, ringTimes);
} }
} }
@ -269,10 +269,8 @@ public class Notifications extends InjectingBroadcastReceiver {
* from preferences. You can make it say anything you like. * from preferences. You can make it say anything you like.
* @param ringTimes number of times to ring (-1 = nonstop) * @param ringTimes number of times to ring (-1 = nonstop)
*/ */
public static void showNotification(int notificationId, Intent intent, int type, String title, public static void showNotification(Context context, int notificationId, Intent intent, int type, String title,
String text, int ringTimes) { String text, int ringTimes) {
Context context = ContextManager.getContext();
if(notificationManager == null) { if(notificationManager == null) {
notificationManager = new AndroidNotificationManager(context); notificationManager = new AndroidNotificationManager(context);
} }

@ -15,7 +15,6 @@ import android.content.res.Resources;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
@ -35,6 +34,7 @@ import javax.inject.Singleton;
import static org.tasks.date.DateTimeUtils.currentTimeMillis; import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.date.DateTimeUtils.newDate; import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.injection.TasksModule.ForApplication;
/** /**
@ -79,9 +79,11 @@ public final class ReminderService {
private AlarmScheduler scheduler = new ReminderAlarmScheduler(); private AlarmScheduler scheduler = new ReminderAlarmScheduler();
private long now = -1; // For tracking when reminders might be scheduled all at once private long now = -1; // For tracking when reminders might be scheduled all at once
private Context context;
@Inject @Inject
ReminderService() { ReminderService(@ForApplication Context context) {
this.context = context;
setPreferenceDefaults(); setPreferenceDefaults();
} }
@ -97,7 +99,6 @@ public final class ReminderService {
return; return;
} }
Context context = ContextManager.getContext();
SharedPreferences prefs = Preferences.getPrefs(context); SharedPreferences prefs = Preferences.getPrefs(context);
Editor editor = prefs.edit(); Editor editor = prefs.edit();
Resources r = context.getResources(); Resources r = context.getResources();
@ -146,10 +147,10 @@ public final class ReminderService {
} }
public void clearAllAlarms(Task task) { public void clearAllAlarms(Task task) {
scheduler.createAlarm(task, NO_ALARM, TYPE_SNOOZE); scheduler.createAlarm(context, task, NO_ALARM, TYPE_SNOOZE);
scheduler.createAlarm(task, NO_ALARM, TYPE_RANDOM); scheduler.createAlarm(context, task, NO_ALARM, TYPE_RANDOM);
scheduler.createAlarm(task, NO_ALARM, TYPE_DUE); scheduler.createAlarm(context, task, NO_ALARM, TYPE_DUE);
scheduler.createAlarm(task, NO_ALARM, TYPE_OVERDUE); scheduler.createAlarm(context, task, NO_ALARM, TYPE_OVERDUE);
} }
private void scheduleAlarm(Task task, TaskDao taskDao) { private void scheduleAlarm(Task task, TaskDao taskDao) {
@ -204,19 +205,19 @@ public final class ReminderService {
// snooze trumps all // snooze trumps all
if(whenSnooze != NO_ALARM) { if(whenSnooze != NO_ALARM) {
scheduler.createAlarm(task, whenSnooze, TYPE_SNOOZE); scheduler.createAlarm(context, task, whenSnooze, TYPE_SNOOZE);
} }
else if(whenRandom < whenDueDate && whenRandom < whenOverdue) { else if(whenRandom < whenDueDate && whenRandom < whenOverdue) {
scheduler.createAlarm(task, whenRandom, TYPE_RANDOM); scheduler.createAlarm(context, task, whenRandom, TYPE_RANDOM);
} }
else if(whenDueDate < whenOverdue) { else if(whenDueDate < whenOverdue) {
scheduler.createAlarm(task, whenDueDate, TYPE_DUE); scheduler.createAlarm(context, task, whenDueDate, TYPE_DUE);
} }
else if(whenOverdue != NO_ALARM) { else if(whenOverdue != NO_ALARM) {
scheduler.createAlarm(task, whenOverdue, TYPE_OVERDUE); scheduler.createAlarm(context, task, whenOverdue, TYPE_OVERDUE);
} }
else { else {
scheduler.createAlarm(task, 0, 0); scheduler.createAlarm(context, task, 0, 0);
} }
} }
@ -403,7 +404,7 @@ public final class ReminderService {
* Interface for testing * Interface for testing
*/ */
public interface AlarmScheduler { public interface AlarmScheduler {
public void createAlarm(Task task, long time, int type); public void createAlarm(Context context, Task task, long time, int type);
} }
public void setScheduler(AlarmScheduler scheduler) { public void setScheduler(AlarmScheduler scheduler) {
@ -419,11 +420,10 @@ public final class ReminderService {
* Create an alarm for the given task at the given type * Create an alarm for the given task at the given type
*/ */
@Override @Override
public void createAlarm(Task task, long time, int type) { public void createAlarm(Context context, Task task, long time, int type) {
if(task.getId() == Task.NO_ID) { if(task.getId() == Task.NO_ID) {
return; return;
} }
Context context = ContextManager.getContext();
Intent intent = new Intent(context, Notifications.class); Intent intent = new Intent(context, Notifications.class);
intent.setType(Long.toString(task.getId())); intent.setType(Long.toString(task.getId()));
intent.setAction(Integer.toString(type)); intent.setAction(Integer.toString(type));

@ -19,6 +19,7 @@ import android.media.AudioManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener; import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
@ -41,6 +42,8 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.CalendarStartupReceiver; import com.todoroo.astrid.gcal.CalendarStartupReceiver;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.provider.Astrid3ContentProvider;
import com.todoroo.astrid.reminders.ReminderStartupReceiver; import com.todoroo.astrid.reminders.ReminderStartupReceiver;
import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
@ -105,6 +108,14 @@ public class StartupService {
// sets up context manager // sets up context manager
ContextManager.setContext(context); ContextManager.setContext(context);
database.addListener(new AbstractDatabase.DatabaseUpdateListener() {
@Override
public void onDatabaseUpdated() {
Astrid2TaskProvider.notifyDatabaseModification(context);
Astrid3ContentProvider.notifyDatabaseModification(context);
}
});
try { try {
database.openForWriting(); database.openForWriting();
checkForMissingColumns(); checkForMissingColumns();

@ -187,7 +187,7 @@ public class ThemeService {
return R.drawable.gl_lists_dark; return R.drawable.gl_lists_dark;
} }
Log.w("ThemeService", "No theme drawable found for " + ContextManager.getResources().getResourceName(lightDrawable)); Log.w("ThemeService", "No theme drawable found for " + lightDrawable);
return lightDrawable; return lightDrawable;
} }

@ -101,20 +101,8 @@ public class TasksWidget extends InjectingAppWidgetProvider {
} }
} }
public static void applyConfigSelection(WidgetHelper widgetHelper, Context context, int id) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Intent intent = new Intent(ContextManager.getContext(), WidgetUpdateService.class);
intent.putExtra(WidgetUpdateService.EXTRA_WIDGET_ID, id);
context.startService(intent);
} else {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(id, widgetHelper.createScrollableWidget(context, id));
updateScrollableWidgets(context, new int[]{id});
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB) @TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static void updateScrollableWidgets(Context context, int[] widgetIds) { public static void updateScrollableWidgets(Context context, int[] widgetIds) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
if (widgetIds == null) { if (widgetIds == null) {
widgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, TasksWidget.class)); widgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, TasksWidget.class));

@ -8,6 +8,7 @@ package com.todoroo.astrid.widget;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
@ -43,8 +44,16 @@ public class WidgetConfigActivity extends InjectingListActivity {
@Inject WidgetHelper widgetHelper; @Inject WidgetHelper widgetHelper;
public void updateWidget() { private void updateWidget() {
TasksWidget.applyConfigSelection(widgetHelper, this, mAppWidgetId); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Intent intent = new Intent(this, WidgetUpdateService.class);
intent.putExtra(WidgetUpdateService.EXTRA_WIDGET_ID, mAppWidgetId);
startService(intent);
} else {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetManager.updateAppWidget(mAppWidgetId, widgetHelper.createScrollableWidget(this, mAppWidgetId));
TasksWidget.updateScrollableWidgets(this, new int[]{mAppWidgetId});
}
} }
@Override @Override

@ -3,23 +3,23 @@ package org.tasks;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import com.todoroo.andlib.service.ContextManager;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import static org.tasks.injection.TasksModule.ForApplication;
@Singleton @Singleton
public class Broadcaster { public class Broadcaster {
private final Context context;
@Inject @Inject
public Broadcaster() { public Broadcaster(@ForApplication Context context) {
this.context = context;
} }
public void sendOrderedBroadcast(Intent intent) { public void sendOrderedBroadcast(Intent intent) {
Context context = ContextManager.getContext(); sendOrderedBroadcast(context, intent);
if (context != null) {
sendOrderedBroadcast(context, intent);
}
} }
public void sendOrderedBroadcast(Context context, Intent intent) { public void sendOrderedBroadcast(Context context, Intent intent) {

@ -2,11 +2,14 @@ package org.tasks;
import android.app.Application; import android.app.Application;
import com.todoroo.andlib.service.ContextManager;
import org.tasks.injection.Injector; import org.tasks.injection.Injector;
import org.tasks.injection.TasksModule;
import dagger.ObjectGraph; import dagger.ObjectGraph;
import static org.tasks.injection.TasksModule.newTasksModule;
public class Tasks extends Application implements Injector { public class Tasks extends Application implements Injector {
Injector injector; Injector injector;
@ -15,6 +18,8 @@ public class Tasks extends Application implements Injector {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
ContextManager.setContext(this);
getInjector(); getInjector();
} }
@ -26,7 +31,7 @@ public class Tasks extends Application implements Injector {
private Injector getInjector() { private Injector getInjector() {
if (injector == null) { if (injector == null) {
injector = new Injector() { injector = new Injector() {
ObjectGraph objectGraph = ObjectGraph.create(new TasksModule()); ObjectGraph objectGraph = ObjectGraph.create(newTasksModule(Tasks.this));
@Override @Override
public void inject(Object caller, Object... modules) { public void inject(Object caller, Object... modules) {

@ -1,5 +1,8 @@
package org.tasks.injection; package org.tasks.injection;
import android.app.Activity;
import android.content.Context;
import com.todoroo.astrid.actfm.TagSettingsActivity; import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.activity.EditPreferences; import com.todoroo.astrid.activity.EditPreferences;
import com.todoroo.astrid.activity.ShareLinkActivity; import com.todoroo.astrid.activity.ShareLinkActivity;
@ -19,7 +22,21 @@ import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.voice.VoiceCommandActivity; import org.tasks.voice.VoiceCommandActivity;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.tasks.injection.TasksModule.ForApplication;
@Module(library = true, @Module(library = true,
injects = { injects = {
@ -43,4 +60,24 @@ import dagger.Module;
OldTaskPreferences.class OldTaskPreferences.class
}) })
public class ActivityModule { public class ActivityModule {
private final Context context;
public ActivityModule(Activity activity) {
context = activity.getApplicationContext();
}
@Singleton
@Provides
@ForApplication
public Context getApplicationContext() {
return context;
}
@Qualifier
@Target({FIELD, PARAMETER, METHOD})
@Documented
@Retention(RUNTIME)
public @interface ForActivity {
}
} }

@ -1,5 +1,7 @@
package org.tasks.injection; package org.tasks.injection;
import android.content.Context;
import com.todoroo.astrid.alarms.AlarmDetailExposer; import com.todoroo.astrid.alarms.AlarmDetailExposer;
import com.todoroo.astrid.alarms.AlarmTaskRepeatListener; import com.todoroo.astrid.alarms.AlarmTaskRepeatListener;
import com.todoroo.astrid.gcal.GCalTaskCompleteListener; import com.todoroo.astrid.gcal.GCalTaskCompleteListener;
@ -18,7 +20,12 @@ import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.scheduling.RefreshBroadcastReceiver; import org.tasks.scheduling.RefreshBroadcastReceiver;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static org.tasks.injection.TasksModule.ForApplication;
@Module(library = true, @Module(library = true,
injects = { injects = {
@ -40,4 +47,17 @@ import dagger.Module;
GtasksStartupReceiver.class GtasksStartupReceiver.class
}) })
public class BroadcastModule { public class BroadcastModule {
private final Context context;
public BroadcastModule(Context context) {
this.context = context;
}
@Singleton
@Provides
@ForApplication
public Context getContext() {
return context.getApplicationContext();
}
} }

@ -1,10 +1,17 @@
package org.tasks.injection; package org.tasks.injection;
import android.content.Context;
import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.provider.Astrid3ContentProvider; import com.todoroo.astrid.provider.Astrid3ContentProvider;
import com.todoroo.astrid.provider.SqlContentProvider; import com.todoroo.astrid.provider.SqlContentProvider;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static org.tasks.injection.TasksModule.ForApplication;
@Module(library = true, @Module(library = true,
injects = { injects = {
@ -13,4 +20,16 @@ import dagger.Module;
SqlContentProvider.class SqlContentProvider.class
}) })
public class ContentProviderModule { public class ContentProviderModule {
private final Context context;
public ContentProviderModule(Context context) {
this.context = context;
}
@Singleton
@Provides
@ForApplication
public Context getContext() {
return context;
}
} }

@ -1,5 +1,8 @@
package org.tasks.injection; package org.tasks.injection;
import android.app.Activity;
import android.content.Context;
import com.todoroo.astrid.actfm.TagCommentsFragment; import com.todoroo.astrid.actfm.TagCommentsFragment;
import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
@ -9,7 +12,13 @@ import com.todoroo.astrid.reminders.NotificationFragment;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment; import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static org.tasks.injection.ActivityModule.ForActivity;
import static org.tasks.injection.TasksModule.ForApplication;
@Module(library = true, @Module(library = true,
injects = { injects = {
@ -23,4 +32,24 @@ import dagger.Module;
TagCommentsFragment.class TagCommentsFragment.class
}) })
public class FragmentModule { public class FragmentModule {
private final Activity activity;
public FragmentModule(Activity activity) {
this.activity = activity;
}
@Singleton
@Provides
@ForApplication
public Context getApplicationContext() {
return activity.getApplicationContext();
}
@Singleton
@Provides
@ForActivity
public Context getContext() {
return activity;
}
} }

@ -6,7 +6,7 @@ import android.support.v7.app.ActionBarActivity;
public class InjectingActionBarActivity extends ActionBarActivity { public class InjectingActionBarActivity extends ActionBarActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
((Injector) getApplication()).inject(this, new ActivityModule()); ((Injector) getApplication()).inject(this, new ActivityModule(this));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

@ -6,7 +6,7 @@ import android.os.Bundle;
public class InjectingActivity extends Activity { public class InjectingActivity extends Activity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
((Injector) getApplication()).inject(this, new ActivityModule()); ((Injector) getApplication()).inject(this, new ActivityModule(this));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

@ -7,7 +7,7 @@ import android.content.Intent;
public class InjectingAppWidgetProvider extends AppWidgetProvider { public class InjectingAppWidgetProvider extends AppWidgetProvider {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
((Injector) context.getApplicationContext()).inject(this, new BroadcastModule()); ((Injector) context.getApplicationContext()).inject(this, new BroadcastModule(context));
super.onReceive(context, intent); super.onReceive(context, intent);
} }

@ -7,6 +7,6 @@ import android.content.Intent;
public class InjectingBroadcastReceiver extends BroadcastReceiver { public class InjectingBroadcastReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
((Injector) context.getApplicationContext()).inject(this, new BroadcastModule()); ((Injector) context.getApplicationContext()).inject(this, new BroadcastModule(context));
} }
} }

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

@ -12,7 +12,7 @@ public class InjectingFragment extends Fragment {
super.onAttach(activity); super.onAttach(activity);
if (!injected) { if (!injected) {
((Injector) activity.getApplication()).inject(this, new FragmentModule()); ((Injector) activity.getApplication()).inject(this, new FragmentModule(activity));
injected = true; injected = true;
} }
} }

@ -6,7 +6,7 @@ import android.os.Bundle;
public class InjectingListActivity extends ListActivity { public class InjectingListActivity extends ListActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
((Injector) getApplication()).inject(this, new ActivityModule()); ((Injector) getApplication()).inject(this, new ActivityModule(this));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

@ -12,7 +12,7 @@ public class InjectingListFragment extends ListFragment {
super.onAttach(activity); super.onAttach(activity);
if (!injected) { if (!injected) {
((Injector) activity.getApplication()).inject(this, new FragmentModule()); ((Injector) activity.getApplication()).inject(this, new FragmentModule(activity));
injected = true; injected = true;
} }
} }

@ -10,6 +10,6 @@ public abstract class InjectingRemoteViewsService extends RemoteViewsService {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
((Injector) getApplication()).inject(this, new ServiceModule()); ((Injector) getApplication()).inject(this, new ServiceModule(this));
} }
} }

@ -7,6 +7,6 @@ public abstract class InjectingService extends Service {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
((Injector) getApplication()).inject(this, new ServiceModule()); ((Injector) getApplication()).inject(this, new ServiceModule(this));
} }
} }

@ -7,7 +7,7 @@ import com.todoroo.astrid.sync.SyncProviderPreferences;
public abstract class InjectingSyncProviderPreferences extends SyncProviderPreferences { public abstract class InjectingSyncProviderPreferences extends SyncProviderPreferences {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
((Injector) getApplication()).inject(this, new ActivityModule()); ((Injector) getApplication()).inject(this, new ActivityModule(this));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

@ -7,7 +7,7 @@ import com.todoroo.andlib.utility.TodorooPreferenceActivity;
public abstract class InjectingTodorooPreferenceActivity extends TodorooPreferenceActivity { public abstract class InjectingTodorooPreferenceActivity extends TodorooPreferenceActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
((Injector) getApplication()).inject(this, new ActivityModule()); ((Injector) getApplication()).inject(this, new ActivityModule(this));
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
} }

@ -1,11 +1,19 @@
package org.tasks.injection; package org.tasks.injection;
import android.app.Service;
import android.content.Context;
import com.todoroo.astrid.gtasks.GtasksBackgroundService; import com.todoroo.astrid.gtasks.GtasksBackgroundService;
import com.todoroo.astrid.reminders.ReminderSchedulingService; import com.todoroo.astrid.reminders.ReminderSchedulingService;
import org.tasks.widget.ScrollableWidgetUpdateService; import org.tasks.widget.ScrollableWidgetUpdateService;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static org.tasks.injection.TasksModule.ForApplication;
@Module(library = true, @Module(library = true,
injects = { injects = {
@ -14,4 +22,17 @@ import dagger.Module;
ScrollableWidgetUpdateService.class ScrollableWidgetUpdateService.class
}) })
public class ServiceModule { public class ServiceModule {
private final Context context;
public ServiceModule(Service service) {
context = service.getApplicationContext();
}
@Singleton
@Provides
@ForApplication
public Context getContext() {
return context;
}
} }

@ -1,5 +1,8 @@
package org.tasks.injection; package org.tasks.injection;
import android.app.Application;
import android.content.Context;
import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.alarms.AlarmControlSet; import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.backup.TasksXmlExporter; import com.todoroo.astrid.backup.TasksXmlExporter;
@ -17,7 +20,20 @@ import com.todoroo.astrid.ui.QuickAddBar;
import org.tasks.widget.ScrollableViewsFactory; import org.tasks.widget.ScrollableViewsFactory;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Module( @Module(
injects = { injects = {
@ -39,4 +55,28 @@ import dagger.Module;
} }
) )
public class TasksModule { public class TasksModule {
private final Context context;
public static TasksModule newTasksModule(Application application) {
return new TasksModule(application.getApplicationContext());
}
TasksModule(Context context) {
this.context = context;
}
@Singleton
@Provides
@ForApplication
public Context getContext() {
return context;
}
@Qualifier
@Target({FIELD, PARAMETER, METHOD})
@Documented
@Retention(RUNTIME)
public @interface ForApplication {
}
} }

@ -7,7 +7,6 @@ import android.content.Intent;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -19,11 +18,13 @@ import javax.inject.Singleton;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
import static com.todoroo.andlib.utility.DateUtilities.ONE_MINUTE; import static com.todoroo.andlib.utility.DateUtilities.ONE_MINUTE;
import static org.tasks.date.DateTimeUtils.currentTimeMillis; import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.injection.TasksModule.ForApplication;
@Singleton @Singleton
public class RefreshScheduler { public class RefreshScheduler {
private final TaskDao taskDao; private final TaskDao taskDao;
private final Context context;
private static final Property<?>[] REFRESH_PROPERTIES = new Property<?>[]{ private static final Property<?>[] REFRESH_PROPERTIES = new Property<?>[]{
Task.DUE_DATE, Task.DUE_DATE,
@ -31,8 +32,9 @@ public class RefreshScheduler {
}; };
@Inject @Inject
public RefreshScheduler(TaskDao taskDao) { public RefreshScheduler(TaskDao taskDao, @ForApplication Context context) {
this.taskDao = taskDao; this.taskDao = taskDao;
this.context = context;
} }
public void scheduleAllAlarms() { public void scheduleAllAlarms() {
@ -66,7 +68,6 @@ public class RefreshScheduler {
} }
dueDate += 1000; // this is ghetto dueDate += 1000; // this is ghetto
Context context = ContextManager.getContext();
Intent intent = new Intent(context, RefreshBroadcastReceiver.class); Intent intent = new Intent(context, RefreshBroadcastReceiver.class);
intent.setAction(Long.toString(dueDate)); intent.setAction(Long.toString(dueDate));
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Loading…
Cancel
Save