From c46153119441d13ecaae1440f3b56686910acb70 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 28 May 2014 11:07:45 -0500 Subject: [PATCH] Inject context --- .../andlib/service/ContextManager.java | 11 ---- .../service/AbstractDependencyInjector.java | 8 ++- .../service/DependencyInjectionService.java | 9 --- .../service/TestDependencyInjector.java | 1 + .../todoroo/andlib/test/TodorooTestCase.java | 6 +- .../service/AstridDependencyInjector.java | 61 +++++++++---------- .../org/tasks/injection/TestInjector.java | 21 +++++++ .../astrid/activity/TaskListFragment.java | 11 ++-- .../todoroo/astrid/alarms/AlarmService.java | 13 ++-- .../astrid/backup/TasksXmlImporter.java | 3 +- .../java/com/todoroo/astrid/dao/Database.java | 10 --- .../com/todoroo/astrid/dao/MetadataDao.java | 2 - .../astrid/gtasks/GtasksFilterExposer.java | 2 +- .../astrid/gtasks/GtasksListFragment.java | 7 ++- .../astrid/gtasks/GtasksScheduler.java | 8 ++- .../gtasks/sync/GtasksSyncV2Provider.java | 12 ++-- .../astrid/helper/SyncActionHelper.java | 5 +- .../astrid/provider/Astrid2TaskProvider.java | 42 +++---------- .../provider/Astrid3ContentProvider.java | 6 +- .../astrid/reminders/Notifications.java | 16 +++-- .../astrid/reminders/ReminderService.java | 30 ++++----- .../astrid/service/StartupService.java | 11 ++++ .../todoroo/astrid/service/ThemeService.java | 2 +- .../todoroo/astrid/widget/TasksWidget.java | 14 +---- .../astrid/widget/WidgetConfigActivity.java | 13 +++- .../src/main/java/org/tasks/Broadcaster.java | 14 ++--- astrid/src/main/java/org/tasks/Tasks.java | 9 ++- .../org/tasks/injection/ActivityModule.java | 37 +++++++++++ .../org/tasks/injection/BroadcastModule.java | 20 ++++++ .../injection/ContentProviderModule.java | 19 ++++++ .../org/tasks/injection/FragmentModule.java | 29 +++++++++ .../injection/InjectingActionBarActivity.java | 2 +- .../tasks/injection/InjectingActivity.java | 2 +- .../injection/InjectingAppWidgetProvider.java | 2 +- .../injection/InjectingBroadcastReceiver.java | 2 +- .../injection/InjectingContentProvider.java | 4 +- .../tasks/injection/InjectingFragment.java | 2 +- .../injection/InjectingListActivity.java | 2 +- .../injection/InjectingListFragment.java | 2 +- .../InjectingRemoteViewsService.java | 2 +- .../org/tasks/injection/InjectingService.java | 2 +- .../InjectingSyncProviderPreferences.java | 2 +- .../InjectingTodorooPreferenceActivity.java | 2 +- .../org/tasks/injection/ServiceModule.java | 21 +++++++ .../java/org/tasks/injection/TasksModule.java | 40 ++++++++++++ .../tasks/scheduling/RefreshScheduler.java | 7 ++- 46 files changed, 346 insertions(+), 200 deletions(-) create mode 100644 astrid/src/androidTest/java/org/tasks/injection/TestInjector.java diff --git a/api/src/main/java/com/todoroo/andlib/service/ContextManager.java b/api/src/main/java/com/todoroo/andlib/service/ContextManager.java index 202377dc9..02a40ba74 100644 --- a/api/src/main/java/com/todoroo/andlib/service/ContextManager.java +++ b/api/src/main/java/com/todoroo/andlib/service/ContextManager.java @@ -7,7 +7,6 @@ package com.todoroo.andlib.service; import android.app.Activity; import android.content.Context; -import android.content.res.Resources; /** * Singleton class to manage current application context @@ -51,14 +50,4 @@ public final class ContextManager { public static String getString(int resId, Object... formatArgs) { return context.getString(resId, formatArgs); } - - /** - * Convenience method to read resources - * - * @return resources object - */ - public static Resources getResources() { - return context.getResources(); - } - } diff --git a/astrid/src/androidTest/java/com/todoroo/andlib/service/AbstractDependencyInjector.java b/astrid/src/androidTest/java/com/todoroo/andlib/service/AbstractDependencyInjector.java index 21164eb94..68efd8476 100644 --- a/astrid/src/androidTest/java/com/todoroo/andlib/service/AbstractDependencyInjector.java +++ b/astrid/src/androidTest/java/com/todoroo/andlib/service/AbstractDependencyInjector.java @@ -5,6 +5,8 @@ */ package com.todoroo.andlib.service; +import android.content.Context; + import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.HashMap; @@ -23,7 +25,7 @@ abstract public class AbstractDependencyInjector { * Initialize list of injection variables. Special care must used when * instantiating classes that themselves depend on dependency injection */ - protected void addInjectables() { + protected void addInjectables(Context context) { // your injectables here } @@ -32,8 +34,8 @@ abstract public class AbstractDependencyInjector { /** * Constructor */ - protected AbstractDependencyInjector() { - addInjectables(); + protected AbstractDependencyInjector(Context context) { + addInjectables(context); } /** diff --git a/astrid/src/androidTest/java/com/todoroo/andlib/service/DependencyInjectionService.java b/astrid/src/androidTest/java/com/todoroo/andlib/service/DependencyInjectionService.java index 34d2c1c39..a0cbd064b 100644 --- a/astrid/src/androidTest/java/com/todoroo/andlib/service/DependencyInjectionService.java +++ b/astrid/src/androidTest/java/com/todoroo/andlib/service/DependencyInjectionService.java @@ -8,8 +8,6 @@ package com.todoroo.andlib.service; import java.lang.reflect.Field; import java.util.LinkedList; - - /** * Simple Dependency Injection Service for Android. *

@@ -115,18 +113,11 @@ public class DependencyInjectionService { injectors)); } - // --- default dependency injector - - private class DefaultDependencyInjector extends AbstractDependencyInjector { - } - // --- static methods private static DependencyInjectionService instance = null; DependencyInjectionService() { - // prevent instantiation - injectors.add(new DefaultDependencyInjector()); } /** diff --git a/astrid/src/androidTest/java/com/todoroo/andlib/service/TestDependencyInjector.java b/astrid/src/androidTest/java/com/todoroo/andlib/service/TestDependencyInjector.java index 5f2198a15..9011a7a04 100644 --- a/astrid/src/androidTest/java/com/todoroo/andlib/service/TestDependencyInjector.java +++ b/astrid/src/androidTest/java/com/todoroo/andlib/service/TestDependencyInjector.java @@ -11,6 +11,7 @@ public class TestDependencyInjector extends AbstractDependencyInjector { private String name; public TestDependencyInjector(String name) { + super(null); this.name = name; } diff --git a/astrid/src/androidTest/java/com/todoroo/andlib/test/TodorooTestCase.java b/astrid/src/androidTest/java/com/todoroo/andlib/test/TodorooTestCase.java index a5129a5ad..395bbc10c 100644 --- a/astrid/src/androidTest/java/com/todoroo/andlib/test/TodorooTestCase.java +++ b/astrid/src/androidTest/java/com/todoroo/andlib/test/TodorooTestCase.java @@ -23,16 +23,12 @@ import java.util.Locale; */ public class TodorooTestCase extends AndroidTestCase { - static { - AstridDependencyInjector.initialize(); - } - @Override protected void setUp() throws Exception { super.setUp(); ContextManager.setContext(this.getContext()); - AstridDependencyInjector.reset(); + AstridDependencyInjector.reset(getContext()); DependencyInjectionService.getInstance().inject(this); setLocale(Locale.ENGLISH); } diff --git a/astrid/src/androidTest/java/com/todoroo/astrid/service/AstridDependencyInjector.java b/astrid/src/androidTest/java/com/todoroo/astrid/service/AstridDependencyInjector.java index a876be6a2..060a46912 100644 --- a/astrid/src/androidTest/java/com/todoroo/astrid/service/AstridDependencyInjector.java +++ b/astrid/src/androidTest/java/com/todoroo/astrid/service/AstridDependencyInjector.java @@ -5,6 +5,8 @@ */ package com.todoroo.astrid.service; +import android.content.Context; + import com.todoroo.andlib.service.AbstractDependencyInjector; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.dao.Database; @@ -27,15 +29,17 @@ import com.todoroo.astrid.tags.TagService; import org.tasks.Broadcaster; import org.tasks.filters.FilterCounter; -import org.tasks.injection.Injector; -import org.tasks.injection.TasksModule; +import org.tasks.injection.TestInjector; import org.tasks.scheduling.RefreshScheduler; import org.tasks.widget.WidgetHelper; import javax.inject.Inject; +import javax.inject.Singleton; 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 @@ -54,6 +58,18 @@ public class AstridDependencyInjector extends AbstractDependencyInjector { } ) 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 Injector injector; - @Inject Database database; @Inject MetadataDao metadataDao; @Inject TagDataDao tagDataDao; @@ -95,18 +109,9 @@ public class AstridDependencyInjector extends AbstractDependencyInjector { * instantiating classes that themselves depend on dependency injection */ @Override - protected void addInjectables() { - injector = new Injector() { - ObjectGraph objectGraph = ObjectGraph.create(new TasksModule()); - - @Override - public void inject(Object caller, Object... modules) { - objectGraph - .plus(modules) - .inject(caller); - } - }; - injector.inject(this, new TestModule()); + protected void addInjectables(Context context) { + new TestInjector(context) + .inject(this, new TestModule(context)); // com.todoroo.astrid.dao injectables.put("database", database); @@ -148,38 +153,28 @@ public class AstridDependencyInjector extends AbstractDependencyInjector { /** * Install this service as the default Dependency Injector */ - public static void initialize() { + private static void initialize(Context context) { if(instance != null) { return; } synchronized(AstridDependencyInjector.class) { if(instance == null) { - instance = new AstridDependencyInjector(); + instance = new AstridDependencyInjector(context); } DependencyInjectionService.getInstance().addInjector(instance); } } - public static void inject(Object caller) { - initialize(); - DependencyInjectionService.getInstance().inject(caller); - } - - AstridDependencyInjector() { + AstridDependencyInjector(Context context) { // prevent instantiation - super(); + super(context); } /** * Flush dependency injection cache. Useful for unit tests. */ - public synchronized static void reset() { + public synchronized static void reset(Context context) { instance = null; - initialize(); - } - - public static Injector getInjector() { - initialize(); - return instance.injector; + initialize(context); } } diff --git a/astrid/src/androidTest/java/org/tasks/injection/TestInjector.java b/astrid/src/androidTest/java/org/tasks/injection/TestInjector.java new file mode 100644 index 000000000..38111ebd4 --- /dev/null +++ b/astrid/src/androidTest/java/org/tasks/injection/TestInjector.java @@ -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); + } +} diff --git a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index ebb3be749..2b931fd4d 100644 --- a/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -44,7 +44,6 @@ import android.widget.ListView; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Join; @@ -93,6 +92,8 @@ import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; +import static org.tasks.injection.ActivityModule.ForActivity; + /** * Primary activity for the Bente application. Shows a list of upcoming tasks * and a user's coaches. @@ -139,6 +140,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel @Inject UpgradeService upgradeService; @Inject TaskListMetadataDao taskListMetadataDao; @Inject SyncV2Service syncService; + @Inject @ForActivity Context context; protected Resources resources; 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() { @@ -1069,14 +1071,14 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel sortSort = sort; if (always) { - SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(ContextManager.getContext()); + SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(context); if (publicPrefs != null) { Editor editor = publicPrefs.edit(); if (editor != null) { editor.putInt(SortHelper.PREF_SORT_FLAGS, flags); editor.putInt(SortHelper.PREF_SORT_SORT, sort); editor.commit(); - TasksWidget.updateWidgets(ContextManager.getContext()); + TasksWidget.updateWidgets(context); } } } @@ -1088,6 +1090,7 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel setUpTaskList(); } } catch (IllegalStateException e) { + log.error(e.getMessage(), e); // TODO: Fragment got detached somehow (rare) } } diff --git a/astrid/src/main/java/com/todoroo/astrid/alarms/AlarmService.java b/astrid/src/main/java/com/todoroo/astrid/alarms/AlarmService.java index 1e85545ea..e06820c3d 100644 --- a/astrid/src/main/java/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/src/main/java/com/todoroo/astrid/alarms/AlarmService.java @@ -12,7 +12,6 @@ import android.content.Intent; import android.util.Log; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Order; @@ -33,6 +32,8 @@ import java.util.LinkedHashSet; import javax.inject.Inject; import javax.inject.Singleton; +import static org.tasks.injection.TasksModule.ForApplication; + /** * Provides operations for working with alerts * @@ -45,11 +46,14 @@ public class AlarmService { // --- data retrieval public static final String IDENTIFIER = "alarms"; //$NON-NLS-1$ - private MetadataService metadataService; + + private final MetadataService metadataService; + private final Context context; @Inject - public AlarmService(MetadataService metadataService) { + public AlarmService(MetadataService metadataService, @ForApplication Context context) { this.metadataService = metadataService; + this.context = context; } /** @@ -75,7 +79,6 @@ public class AlarmService { metadata.add(item); } - final Context context = ContextManager.getContext(); final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 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) { - Context context = ContextManager.getContext(); Intent intent = new Intent(context, Notifications.class); intent.setAction("ALARM" + alarm.getId()); //$NON-NLS-1$ intent.putExtra(Notifications.ID_KEY, taskId); @@ -175,7 +177,6 @@ public class AlarmService { long taskId = alarm.getTask(); - Context context = ContextManager.getContext(); AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = pendingIntentForAlarm(alarm, taskId); diff --git a/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlImporter.java b/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlImporter.java index 6a68b0175..a49d85d4a 100644 --- a/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlImporter.java +++ b/astrid/src/main/java/com/todoroo/astrid/backup/TasksXmlImporter.java @@ -22,7 +22,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.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; @@ -166,7 +165,7 @@ public class TasksXmlImporter { } } finally { 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() { @Override public void run() { diff --git a/astrid/src/main/java/com/todoroo/astrid/dao/Database.java b/astrid/src/main/java/com/todoroo/astrid/dao/Database.java index 86a682608..d53f9f1dc 100644 --- a/astrid/src/main/java/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/main/java/com/todoroo/astrid/dao/Database.java @@ -21,8 +21,6 @@ import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.data.TaskListMetadata; 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.Singleton; @@ -68,14 +66,6 @@ public class Database extends AbstractDatabase { @Inject public Database() { - super(); - addListener(new DatabaseUpdateListener() { - @Override - public void onDatabaseUpdated() { - Astrid2TaskProvider.notifyDatabaseModification(); - Astrid3ContentProvider.notifyDatabaseModification(); - } - }); } // --- implementation diff --git a/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java b/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java index 2ce30293d..fe813e247 100644 --- a/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java +++ b/astrid/src/main/java/com/todoroo/astrid/dao/MetadataDao.java @@ -18,7 +18,6 @@ import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.utility.AstridPreferences; @@ -133,7 +132,6 @@ public class MetadataDao extends DatabaseDao { Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false); } } - Astrid2TaskProvider.notifyDatabaseModification(); return state; } diff --git a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index 544b40703..dcdba3a66 100644 --- a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -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.ORDER.name, PermaSql.VALUE_NOW); 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( MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), TaskCriteria.notDeleted(), diff --git a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksListFragment.java b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksListFragment.java index 6a9ec34d0..ef098410e 100644 --- a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksListFragment.java +++ b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksListFragment.java @@ -7,6 +7,7 @@ package com.todoroo.astrid.gtasks; import android.app.Activity; import android.app.ProgressDialog; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; @@ -14,7 +15,6 @@ import android.widget.TextView; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.api.AstridApiConstants; @@ -33,6 +33,8 @@ import org.tasks.R; import javax.inject.Inject; +import static org.tasks.injection.ActivityModule.ForActivity; + public class GtasksListFragment extends SubtasksListFragment { public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$ @@ -43,6 +45,7 @@ public class GtasksListFragment extends SubtasksListFragment { @Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksMetadataService gtasksMetadataService; @Inject SyncV2Service syncService; + @Inject @ForActivity Context context; private StoreObject list; @@ -87,7 +90,7 @@ public class GtasksListFragment extends SubtasksListFragment { @Override public void run() { if (manual) { - ContextManager.getContext().sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH)); + context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH)); } else { refresh(); } diff --git a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksScheduler.java b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksScheduler.java index f648f7f9b..637e42c1a 100644 --- a/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksScheduler.java +++ b/astrid/src/main/java/com/todoroo/astrid/gtasks/GtasksScheduler.java @@ -6,13 +6,14 @@ import android.content.Context; import android.content.Intent; import android.util.Log; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import javax.inject.Inject; import javax.inject.Singleton; +import static org.tasks.injection.TasksModule.ForApplication; + @Singleton public class GtasksScheduler { @@ -20,10 +21,12 @@ public class GtasksScheduler { private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L; private final GtasksPreferenceService gtasksPreferenceService; + private Context context; @Inject - public GtasksScheduler(GtasksPreferenceService gtasksPreferenceService) { + public GtasksScheduler(GtasksPreferenceService gtasksPreferenceService, @ForApplication Context context) { this.gtasksPreferenceService = gtasksPreferenceService; + this.context = context; } /** @@ -37,7 +40,6 @@ public class GtasksScheduler { } catch(ClassCastException e) { Preferences.setStringFromInteger(gtasksPreferenceService.getSyncIntervalKey(), 0); } - Context context = ContextManager.getContext(); if(syncFrequencySeconds <= 0) { unscheduleService(context); return; diff --git a/astrid/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 600998b82..d3fafe19c 100644 --- a/astrid/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -5,12 +5,12 @@ */ package com.todoroo.astrid.gtasks.sync; +import android.content.Context; import android.text.TextUtils; import com.google.api.services.tasks.model.Tasks; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; @@ -52,6 +52,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import static org.tasks.date.DateTimeUtils.newDate; +import static org.tasks.injection.TasksModule.ForApplication; @Singleton public class GtasksSyncV2Provider extends SyncV2Provider { @@ -64,10 +65,12 @@ public class GtasksSyncV2Provider extends SyncV2Provider { private final GtasksListService gtasksListService; private final GtasksMetadataService gtasksMetadataService; private final GtasksTaskListUpdater gtasksTaskListUpdater; + private Context context; @Inject 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.metadataService = metadataService; this.storeObjectDao = storeObjectDao; @@ -76,11 +79,12 @@ public class GtasksSyncV2Provider extends SyncV2Provider { this.gtasksListService = gtasksListService; this.gtasksMetadataService = gtasksMetadataService; this.gtasksTaskListUpdater = gtasksTaskListUpdater; + this.context = context; } @Override public String getName() { - return ContextManager.getString(R.string.gtasks_GPr_header); + return context.getString(R.string.gtasks_GPr_header); } @Override @@ -231,7 +235,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider { private String getValidatedAuthToken() { String authToken = gtasksPreferenceService.getToken(); try { - authToken = GtasksTokenValidator.validateAuthToken(ContextManager.getContext(), authToken); + authToken = GtasksTokenValidator.validateAuthToken(context, authToken); if (authToken != null) { gtasksPreferenceService.setToken(authToken); } diff --git a/astrid/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java b/astrid/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java index 444faab9b..6598cf95a 100644 --- a/astrid/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java +++ b/astrid/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java @@ -18,7 +18,6 @@ import android.os.Bundle; import android.support.v4.app.Fragment; import android.widget.ArrayAdapter; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; @@ -69,7 +68,7 @@ public class SyncActionHelper { // --- boilerplate - public SyncActionHelper(SyncV2Service syncService, Activity activity, Fragment fragment) { + public SyncActionHelper(SyncV2Service syncService, final Activity activity, Fragment fragment) { this.syncService = syncService; this.activity = activity; this.fragment = fragment; @@ -77,7 +76,7 @@ public class SyncActionHelper { R.id.progressBar, new Runnable() { @Override public void run() { - ContextManager.getContext().sendBroadcast( + activity.sendBroadcast( new Intent( AstridApiConstants.BROADCAST_EVENT_REFRESH)); } diff --git a/astrid/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java b/astrid/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java index b682a0f9d..0a58c96f1 100644 --- a/astrid/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java +++ b/astrid/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java @@ -11,10 +11,8 @@ import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; -import android.util.Log; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; 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.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.tasks.injection.InjectingContentProvider; import java.math.BigInteger; @@ -47,9 +47,7 @@ import dagger.Lazy; */ public class Astrid2TaskProvider extends InjectingContentProvider { - private static final String TAG = "MessageProvider"; - - private static final boolean LOGD = false; + private static final Logger log = LoggerFactory.getLogger(Astrid2TaskProvider.class); public static final String AUTHORITY = "org.tasks.tasksprovider"; @@ -85,8 +83,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { @Inject Lazy taskService; @Inject Lazy tagService; - private static Context ctx = null; - static { URI_MATCHER.addURI(AUTHORITY, "tasks", URI_TASKS); URI_MATCHER.addURI(AUTHORITY, "tags", URI_TAGS); @@ -94,10 +90,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { - if (LOGD) { - Log.d(TAG, "delete"); - } - return 0; } @@ -114,8 +106,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { @Override public boolean onCreate() { super.onCreate(); - ctx = getContext(); - ContextManager.setContext(ctx); return false; } @@ -178,7 +168,7 @@ public class Astrid2TaskProvider extends InjectingContentProvider { TaskCriteria.isVisible())). orderBy(SortHelper.defaultTaskOrder()).limit(MAX_NUMBER_OF_TASKS)); try { - int[] importanceColors = Task.getImportanceColors(ctx.getResources()); + int[] importanceColors = Task.getImportanceColors(getContext().getResources()); Task task = new Task(); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToNext(); @@ -206,11 +196,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - - if (LOGD) { - Log.d(TAG, "query"); - } - Cursor cursor; switch (URI_MATCHER.match(uri)) { @@ -231,11 +216,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - - if (LOGD) { - Log.d(TAG, "update"); - } - switch (URI_MATCHER.match(uri)) { case URI_TASKS: @@ -276,19 +256,11 @@ public class Astrid2TaskProvider extends InjectingContentProvider { } } - public static void notifyDatabaseModification() { - - if (LOGD) { - Log.d(TAG, "notifyDatabaseModification"); - } - - if(ctx == null) { - ctx = ContextManager.getContext(); - } + public static void notifyDatabaseModification(Context context) { try { - ctx.getContentResolver().notifyChange(CONTENT_URI, null); + context.getContentResolver().notifyChange(CONTENT_URI, null); } catch (Exception e) { - // no context was available + log.error(e.getMessage(), e); } } } diff --git a/astrid/src/main/java/com/todoroo/astrid/provider/Astrid3ContentProvider.java b/astrid/src/main/java/com/todoroo/astrid/provider/Astrid3ContentProvider.java index 8669698dc..745a5da31 100644 --- a/astrid/src/main/java/com/todoroo/astrid/provider/Astrid3ContentProvider.java +++ b/astrid/src/main/java/com/todoroo/astrid/provider/Astrid3ContentProvider.java @@ -8,6 +8,7 @@ package com.todoroo.astrid.provider; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; +import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.SQLException; @@ -18,7 +19,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.ContextManager; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; @@ -394,8 +394,8 @@ public class Astrid3ContentProvider extends InjectingContentProvider { // --- change listeners - public static void notifyDatabaseModification() { - ContentResolver cr = ContextManager.getContext().getContentResolver(); + public static void notifyDatabaseModification(Context context) { + ContentResolver cr = context.getContentResolver(); cr.notifyChange(Task.CONTENT_URI, null); } } diff --git a/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java b/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java index b66fb4286..d605446a1 100644 --- a/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java +++ b/astrid/src/main/java/com/todoroo/astrid/reminders/Notifications.java @@ -50,6 +50,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import static org.tasks.date.DateTimeUtils.currentTimeMillis; +import static org.tasks.injection.TasksModule.ForApplication; public class Notifications extends InjectingBroadcastReceiver { @@ -82,6 +83,7 @@ public class Notifications extends InjectingBroadcastReceiver { // --- instance variables @Inject TaskDao taskDao; + @Inject @ForApplication Context context; public static NotificationManager notificationManager = null; private static boolean forceNotificationManager = false; @@ -187,7 +189,6 @@ public class Notifications extends InjectingBroadcastReceiver { task.setSocialReminder(Task.REMINDER_SOCIAL_UNSEEN); taskDao.saveExisting(task); - Context context = ContextManager.getContext(); String title = context.getString(R.string.app_name); 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.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; } - private static void requestNotification(long taskId, Intent intent, int type, String title, String text, int ringTimes) { - Context context = ContextManager.getContext(); + private static void requestNotification(Context context, long taskId, Intent intent, int type, String title, String text, int ringTimes) { Intent inAppNotify = new Intent(BROADCAST_IN_APP_NOTIFY); inAppNotify.putExtra(EXTRAS_NOTIF_ID, (int)taskId); inAppNotify.putExtra(NotificationFragment.TOKEN_ID, taskId); @@ -225,7 +225,7 @@ public class Notifications extends InjectingBroadcastReceiver { inAppNotify.putExtra(EXTRAS_RING_TIMES, ringTimes); if(forceNotificationManager) { - new ShowNotificationReceiver().onReceive(ContextManager.getContext(), inAppNotify); + new ShowNotificationReceiver().onReceive(context, inAppNotify); } else { context.sendOrderedBroadcast(inAppNotify, AstridApiConstants.PERMISSION_READ); } @@ -246,7 +246,7 @@ public class Notifications extends InjectingBroadcastReceiver { String title = intent.getStringExtra(EXTRAS_TITLE); String text = intent.getStringExtra(EXTRAS_TEXT); 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. * @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) { - Context context = ContextManager.getContext(); - if(notificationManager == null) { notificationManager = new AndroidNotificationManager(context); } diff --git a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java index a61fc94a9..9fb3b25b8 100644 --- a/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java +++ b/astrid/src/main/java/com/todoroo/astrid/reminders/ReminderService.java @@ -15,7 +15,6 @@ import android.content.res.Resources; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; 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.newDate; +import static org.tasks.injection.TasksModule.ForApplication; /** @@ -79,9 +79,11 @@ public final class ReminderService { private AlarmScheduler scheduler = new ReminderAlarmScheduler(); private long now = -1; // For tracking when reminders might be scheduled all at once + private Context context; @Inject - ReminderService() { + ReminderService(@ForApplication Context context) { + this.context = context; setPreferenceDefaults(); } @@ -97,7 +99,6 @@ public final class ReminderService { return; } - Context context = ContextManager.getContext(); SharedPreferences prefs = Preferences.getPrefs(context); Editor editor = prefs.edit(); Resources r = context.getResources(); @@ -146,10 +147,10 @@ public final class ReminderService { } public void clearAllAlarms(Task task) { - scheduler.createAlarm(task, NO_ALARM, TYPE_SNOOZE); - scheduler.createAlarm(task, NO_ALARM, TYPE_RANDOM); - scheduler.createAlarm(task, NO_ALARM, TYPE_DUE); - scheduler.createAlarm(task, NO_ALARM, TYPE_OVERDUE); + scheduler.createAlarm(context, task, NO_ALARM, TYPE_SNOOZE); + scheduler.createAlarm(context, task, NO_ALARM, TYPE_RANDOM); + scheduler.createAlarm(context, task, NO_ALARM, TYPE_DUE); + scheduler.createAlarm(context, task, NO_ALARM, TYPE_OVERDUE); } private void scheduleAlarm(Task task, TaskDao taskDao) { @@ -204,19 +205,19 @@ public final class ReminderService { // snooze trumps all if(whenSnooze != NO_ALARM) { - scheduler.createAlarm(task, whenSnooze, TYPE_SNOOZE); + scheduler.createAlarm(context, task, whenSnooze, TYPE_SNOOZE); } else if(whenRandom < whenDueDate && whenRandom < whenOverdue) { - scheduler.createAlarm(task, whenRandom, TYPE_RANDOM); + scheduler.createAlarm(context, task, whenRandom, TYPE_RANDOM); } else if(whenDueDate < whenOverdue) { - scheduler.createAlarm(task, whenDueDate, TYPE_DUE); + scheduler.createAlarm(context, task, whenDueDate, TYPE_DUE); } else if(whenOverdue != NO_ALARM) { - scheduler.createAlarm(task, whenOverdue, TYPE_OVERDUE); + scheduler.createAlarm(context, task, whenOverdue, TYPE_OVERDUE); } else { - scheduler.createAlarm(task, 0, 0); + scheduler.createAlarm(context, task, 0, 0); } } @@ -403,7 +404,7 @@ public final class ReminderService { * Interface for testing */ 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) { @@ -419,11 +420,10 @@ public final class ReminderService { * Create an alarm for the given task at the given type */ @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) { return; } - Context context = ContextManager.getContext(); Intent intent = new Intent(context, Notifications.class); intent.setType(Long.toString(task.getId())); intent.setAction(Integer.toString(type)); diff --git a/astrid/src/main/java/com/todoroo/astrid/service/StartupService.java b/astrid/src/main/java/com/todoroo/astrid/service/StartupService.java index d82a8f689..7f7c9ac8a 100644 --- a/astrid/src/main/java/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/main/java/com/todoroo/astrid/service/StartupService.java @@ -19,6 +19,7 @@ import android.media.AudioManager; import android.util.Log; import android.widget.Toast; +import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener; import com.todoroo.andlib.data.TodorooCursor; 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.gtasks.GtasksPreferenceService; 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.tags.TaskToTagMetadata; import com.todoroo.astrid.utility.AstridPreferences; @@ -105,6 +108,14 @@ public class StartupService { // sets up context manager ContextManager.setContext(context); + database.addListener(new AbstractDatabase.DatabaseUpdateListener() { + @Override + public void onDatabaseUpdated() { + Astrid2TaskProvider.notifyDatabaseModification(context); + Astrid3ContentProvider.notifyDatabaseModification(context); + } + }); + try { database.openForWriting(); checkForMissingColumns(); diff --git a/astrid/src/main/java/com/todoroo/astrid/service/ThemeService.java b/astrid/src/main/java/com/todoroo/astrid/service/ThemeService.java index 9683fb897..fc05b7f04 100644 --- a/astrid/src/main/java/com/todoroo/astrid/service/ThemeService.java +++ b/astrid/src/main/java/com/todoroo/astrid/service/ThemeService.java @@ -187,7 +187,7 @@ public class ThemeService { 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; } diff --git a/astrid/src/main/java/com/todoroo/astrid/widget/TasksWidget.java b/astrid/src/main/java/com/todoroo/astrid/widget/TasksWidget.java index 1eeb1f41b..7071e9cf1 100644 --- a/astrid/src/main/java/com/todoroo/astrid/widget/TasksWidget.java +++ b/astrid/src/main/java/com/todoroo/astrid/widget/TasksWidget.java @@ -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) - private static void updateScrollableWidgets(Context context, int[] widgetIds) { + public static void updateScrollableWidgets(Context context, int[] widgetIds) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); if (widgetIds == null) { widgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, TasksWidget.class)); diff --git a/astrid/src/main/java/com/todoroo/astrid/widget/WidgetConfigActivity.java b/astrid/src/main/java/com/todoroo/astrid/widget/WidgetConfigActivity.java index 9d4919f1f..e0e16676a 100644 --- a/astrid/src/main/java/com/todoroo/astrid/widget/WidgetConfigActivity.java +++ b/astrid/src/main/java/com/todoroo/astrid/widget/WidgetConfigActivity.java @@ -8,6 +8,7 @@ package com.todoroo.astrid.widget; import android.appwidget.AppWidgetManager; import android.content.ContentValues; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; @@ -43,8 +44,16 @@ public class WidgetConfigActivity extends InjectingListActivity { @Inject WidgetHelper widgetHelper; - public void updateWidget() { - TasksWidget.applyConfigSelection(widgetHelper, this, mAppWidgetId); + private void updateWidget() { + 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 diff --git a/astrid/src/main/java/org/tasks/Broadcaster.java b/astrid/src/main/java/org/tasks/Broadcaster.java index 68975ff6e..b4f55205a 100644 --- a/astrid/src/main/java/org/tasks/Broadcaster.java +++ b/astrid/src/main/java/org/tasks/Broadcaster.java @@ -3,23 +3,23 @@ package org.tasks; import android.content.Context; import android.content.Intent; -import com.todoroo.andlib.service.ContextManager; - import javax.inject.Inject; import javax.inject.Singleton; +import static org.tasks.injection.TasksModule.ForApplication; + @Singleton public class Broadcaster { + private final Context context; + @Inject - public Broadcaster() { + public Broadcaster(@ForApplication Context context) { + this.context = context; } public void sendOrderedBroadcast(Intent intent) { - Context context = ContextManager.getContext(); - if (context != null) { - sendOrderedBroadcast(context, intent); - } + sendOrderedBroadcast(context, intent); } public void sendOrderedBroadcast(Context context, Intent intent) { diff --git a/astrid/src/main/java/org/tasks/Tasks.java b/astrid/src/main/java/org/tasks/Tasks.java index efa235df6..ba1261509 100644 --- a/astrid/src/main/java/org/tasks/Tasks.java +++ b/astrid/src/main/java/org/tasks/Tasks.java @@ -2,11 +2,14 @@ package org.tasks; import android.app.Application; +import com.todoroo.andlib.service.ContextManager; + import org.tasks.injection.Injector; -import org.tasks.injection.TasksModule; import dagger.ObjectGraph; +import static org.tasks.injection.TasksModule.newTasksModule; + public class Tasks extends Application implements Injector { Injector injector; @@ -15,6 +18,8 @@ public class Tasks extends Application implements Injector { public void onCreate() { super.onCreate(); + ContextManager.setContext(this); + getInjector(); } @@ -26,7 +31,7 @@ public class Tasks extends Application implements Injector { private Injector getInjector() { if (injector == null) { injector = new Injector() { - ObjectGraph objectGraph = ObjectGraph.create(new TasksModule()); + ObjectGraph objectGraph = ObjectGraph.create(newTasksModule(Tasks.this)); @Override public void inject(Object caller, Object... modules) { diff --git a/astrid/src/main/java/org/tasks/injection/ActivityModule.java b/astrid/src/main/java/org/tasks/injection/ActivityModule.java index 6926747ba..83e37d18d 100644 --- a/astrid/src/main/java/org/tasks/injection/ActivityModule.java +++ b/astrid/src/main/java/org/tasks/injection/ActivityModule.java @@ -1,5 +1,8 @@ package org.tasks.injection; +import android.app.Activity; +import android.content.Context; + import com.todoroo.astrid.actfm.TagSettingsActivity; import com.todoroo.astrid.activity.EditPreferences; import com.todoroo.astrid.activity.ShareLinkActivity; @@ -19,7 +22,21 @@ import com.todoroo.astrid.widget.WidgetConfigActivity; 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.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, injects = { @@ -43,4 +60,24 @@ import dagger.Module; OldTaskPreferences.class }) 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 { + } } diff --git a/astrid/src/main/java/org/tasks/injection/BroadcastModule.java b/astrid/src/main/java/org/tasks/injection/BroadcastModule.java index 33e3c54eb..b2a80a2c1 100644 --- a/astrid/src/main/java/org/tasks/injection/BroadcastModule.java +++ b/astrid/src/main/java/org/tasks/injection/BroadcastModule.java @@ -1,5 +1,7 @@ package org.tasks.injection; +import android.content.Context; + import com.todoroo.astrid.alarms.AlarmDetailExposer; import com.todoroo.astrid.alarms.AlarmTaskRepeatListener; import com.todoroo.astrid.gcal.GCalTaskCompleteListener; @@ -18,7 +20,12 @@ import com.todoroo.astrid.widget.TasksWidget; import org.tasks.scheduling.RefreshBroadcastReceiver; +import javax.inject.Singleton; + import dagger.Module; +import dagger.Provides; + +import static org.tasks.injection.TasksModule.ForApplication; @Module(library = true, injects = { @@ -40,4 +47,17 @@ import dagger.Module; GtasksStartupReceiver.class }) public class BroadcastModule { + + private final Context context; + + public BroadcastModule(Context context) { + this.context = context; + } + + @Singleton + @Provides + @ForApplication + public Context getContext() { + return context.getApplicationContext(); + } } diff --git a/astrid/src/main/java/org/tasks/injection/ContentProviderModule.java b/astrid/src/main/java/org/tasks/injection/ContentProviderModule.java index 2d1bbd1a3..9279eaf02 100644 --- a/astrid/src/main/java/org/tasks/injection/ContentProviderModule.java +++ b/astrid/src/main/java/org/tasks/injection/ContentProviderModule.java @@ -1,10 +1,17 @@ package org.tasks.injection; +import android.content.Context; + import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.provider.Astrid3ContentProvider; import com.todoroo.astrid.provider.SqlContentProvider; +import javax.inject.Singleton; + import dagger.Module; +import dagger.Provides; + +import static org.tasks.injection.TasksModule.ForApplication; @Module(library = true, injects = { @@ -13,4 +20,16 @@ import dagger.Module; SqlContentProvider.class }) public class ContentProviderModule { + private final Context context; + + public ContentProviderModule(Context context) { + this.context = context; + } + + @Singleton + @Provides + @ForApplication + public Context getContext() { + return context; + } } diff --git a/astrid/src/main/java/org/tasks/injection/FragmentModule.java b/astrid/src/main/java/org/tasks/injection/FragmentModule.java index d3d1cf905..a31106406 100644 --- a/astrid/src/main/java/org/tasks/injection/FragmentModule.java +++ b/astrid/src/main/java/org/tasks/injection/FragmentModule.java @@ -1,5 +1,8 @@ package org.tasks.injection; +import android.app.Activity; +import android.content.Context; + import com.todoroo.astrid.actfm.TagCommentsFragment; import com.todoroo.astrid.actfm.TagViewFragment; 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.SubtasksTagListFragment; +import javax.inject.Singleton; + import dagger.Module; +import dagger.Provides; + +import static org.tasks.injection.ActivityModule.ForActivity; +import static org.tasks.injection.TasksModule.ForApplication; @Module(library = true, injects = { @@ -23,4 +32,24 @@ import dagger.Module; TagCommentsFragment.class }) 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; + } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingActionBarActivity.java b/astrid/src/main/java/org/tasks/injection/InjectingActionBarActivity.java index 51eb88c0d..b272204b2 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingActionBarActivity.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingActionBarActivity.java @@ -6,7 +6,7 @@ import android.support.v7.app.ActionBarActivity; public class InjectingActionBarActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { - ((Injector) getApplication()).inject(this, new ActivityModule()); + ((Injector) getApplication()).inject(this, new ActivityModule(this)); super.onCreate(savedInstanceState); } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingActivity.java b/astrid/src/main/java/org/tasks/injection/InjectingActivity.java index 7ea16fbb1..66f5be34c 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingActivity.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingActivity.java @@ -6,7 +6,7 @@ import android.os.Bundle; public class InjectingActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { - ((Injector) getApplication()).inject(this, new ActivityModule()); + ((Injector) getApplication()).inject(this, new ActivityModule(this)); super.onCreate(savedInstanceState); } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingAppWidgetProvider.java b/astrid/src/main/java/org/tasks/injection/InjectingAppWidgetProvider.java index 10d04325e..34e0ca733 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingAppWidgetProvider.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingAppWidgetProvider.java @@ -7,7 +7,7 @@ import android.content.Intent; public class InjectingAppWidgetProvider extends AppWidgetProvider { @Override 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); } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingBroadcastReceiver.java b/astrid/src/main/java/org/tasks/injection/InjectingBroadcastReceiver.java index 809ffb847..3506f9db1 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingBroadcastReceiver.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingBroadcastReceiver.java @@ -7,6 +7,6 @@ import android.content.Intent; public class InjectingBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - ((Injector) context.getApplicationContext()).inject(this, new BroadcastModule()); + ((Injector) context.getApplicationContext()).inject(this, new BroadcastModule(context)); } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingContentProvider.java b/astrid/src/main/java/org/tasks/injection/InjectingContentProvider.java index 122370701..c5ccc5178 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingContentProvider.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingContentProvider.java @@ -1,11 +1,13 @@ package org.tasks.injection; import android.content.ContentProvider; +import android.content.Context; public abstract class InjectingContentProvider extends ContentProvider { @Override public boolean onCreate() { - ((Injector) getContext().getApplicationContext()).inject(this, new ContentProviderModule()); + Context context = getContext(); + ((Injector) context.getApplicationContext()).inject(this, new ContentProviderModule(context)); return true; } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingFragment.java b/astrid/src/main/java/org/tasks/injection/InjectingFragment.java index 7c6fb62b0..80ce71cbf 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingFragment.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingFragment.java @@ -12,7 +12,7 @@ public class InjectingFragment extends Fragment { super.onAttach(activity); if (!injected) { - ((Injector) activity.getApplication()).inject(this, new FragmentModule()); + ((Injector) activity.getApplication()).inject(this, new FragmentModule(activity)); injected = true; } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingListActivity.java b/astrid/src/main/java/org/tasks/injection/InjectingListActivity.java index d07a5f24a..516a8a89f 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingListActivity.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingListActivity.java @@ -6,7 +6,7 @@ import android.os.Bundle; public class InjectingListActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { - ((Injector) getApplication()).inject(this, new ActivityModule()); + ((Injector) getApplication()).inject(this, new ActivityModule(this)); super.onCreate(savedInstanceState); } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingListFragment.java b/astrid/src/main/java/org/tasks/injection/InjectingListFragment.java index 35c13951d..d8f545d2c 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingListFragment.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingListFragment.java @@ -12,7 +12,7 @@ public class InjectingListFragment extends ListFragment { super.onAttach(activity); if (!injected) { - ((Injector) activity.getApplication()).inject(this, new FragmentModule()); + ((Injector) activity.getApplication()).inject(this, new FragmentModule(activity)); injected = true; } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingRemoteViewsService.java b/astrid/src/main/java/org/tasks/injection/InjectingRemoteViewsService.java index 693e6a057..bbebb92f0 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingRemoteViewsService.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingRemoteViewsService.java @@ -10,6 +10,6 @@ public abstract class InjectingRemoteViewsService extends RemoteViewsService { public void onCreate() { super.onCreate(); - ((Injector) getApplication()).inject(this, new ServiceModule()); + ((Injector) getApplication()).inject(this, new ServiceModule(this)); } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingService.java b/astrid/src/main/java/org/tasks/injection/InjectingService.java index 63c62b367..e3e8e909b 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingService.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingService.java @@ -7,6 +7,6 @@ public abstract class InjectingService extends Service { public void onCreate() { super.onCreate(); - ((Injector) getApplication()).inject(this, new ServiceModule()); + ((Injector) getApplication()).inject(this, new ServiceModule(this)); } } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingSyncProviderPreferences.java b/astrid/src/main/java/org/tasks/injection/InjectingSyncProviderPreferences.java index 9cf6be66f..7a6a2091f 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingSyncProviderPreferences.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingSyncProviderPreferences.java @@ -7,7 +7,7 @@ import com.todoroo.astrid.sync.SyncProviderPreferences; public abstract class InjectingSyncProviderPreferences extends SyncProviderPreferences { @Override public void onCreate(Bundle savedInstanceState) { - ((Injector) getApplication()).inject(this, new ActivityModule()); + ((Injector) getApplication()).inject(this, new ActivityModule(this)); super.onCreate(savedInstanceState); } diff --git a/astrid/src/main/java/org/tasks/injection/InjectingTodorooPreferenceActivity.java b/astrid/src/main/java/org/tasks/injection/InjectingTodorooPreferenceActivity.java index f96669e78..a72c74b5d 100644 --- a/astrid/src/main/java/org/tasks/injection/InjectingTodorooPreferenceActivity.java +++ b/astrid/src/main/java/org/tasks/injection/InjectingTodorooPreferenceActivity.java @@ -7,7 +7,7 @@ import com.todoroo.andlib.utility.TodorooPreferenceActivity; public abstract class InjectingTodorooPreferenceActivity extends TodorooPreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { - ((Injector) getApplication()).inject(this, new ActivityModule()); + ((Injector) getApplication()).inject(this, new ActivityModule(this)); super.onCreate(savedInstanceState); } diff --git a/astrid/src/main/java/org/tasks/injection/ServiceModule.java b/astrid/src/main/java/org/tasks/injection/ServiceModule.java index 1a1116755..a6babf17b 100644 --- a/astrid/src/main/java/org/tasks/injection/ServiceModule.java +++ b/astrid/src/main/java/org/tasks/injection/ServiceModule.java @@ -1,11 +1,19 @@ package org.tasks.injection; +import android.app.Service; +import android.content.Context; + import com.todoroo.astrid.gtasks.GtasksBackgroundService; import com.todoroo.astrid.reminders.ReminderSchedulingService; import org.tasks.widget.ScrollableWidgetUpdateService; +import javax.inject.Singleton; + import dagger.Module; +import dagger.Provides; + +import static org.tasks.injection.TasksModule.ForApplication; @Module(library = true, injects = { @@ -14,4 +22,17 @@ import dagger.Module; ScrollableWidgetUpdateService.class }) public class ServiceModule { + + private final Context context; + + public ServiceModule(Service service) { + context = service.getApplicationContext(); + } + + @Singleton + @Provides + @ForApplication + public Context getContext() { + return context; + } } diff --git a/astrid/src/main/java/org/tasks/injection/TasksModule.java b/astrid/src/main/java/org/tasks/injection/TasksModule.java index 8afcd789c..81a9309e1 100644 --- a/astrid/src/main/java/org/tasks/injection/TasksModule.java +++ b/astrid/src/main/java/org/tasks/injection/TasksModule.java @@ -1,5 +1,8 @@ package org.tasks.injection; +import android.app.Application; +import android.content.Context; + import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.alarms.AlarmControlSet; import com.todoroo.astrid.backup.TasksXmlExporter; @@ -17,7 +20,20 @@ import com.todoroo.astrid.ui.QuickAddBar; 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.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( injects = { @@ -39,4 +55,28 @@ import dagger.Module; } ) 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 { + } } diff --git a/astrid/src/main/java/org/tasks/scheduling/RefreshScheduler.java b/astrid/src/main/java/org/tasks/scheduling/RefreshScheduler.java index 34ce972e0..13af85104 100644 --- a/astrid/src/main/java/org/tasks/scheduling/RefreshScheduler.java +++ b/astrid/src/main/java/org/tasks/scheduling/RefreshScheduler.java @@ -7,7 +7,6 @@ import android.content.Intent; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.TaskDao; @@ -19,11 +18,13 @@ import javax.inject.Singleton; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import static com.todoroo.andlib.utility.DateUtilities.ONE_MINUTE; import static org.tasks.date.DateTimeUtils.currentTimeMillis; +import static org.tasks.injection.TasksModule.ForApplication; @Singleton public class RefreshScheduler { private final TaskDao taskDao; + private final Context context; private static final Property[] REFRESH_PROPERTIES = new Property[]{ Task.DUE_DATE, @@ -31,8 +32,9 @@ public class RefreshScheduler { }; @Inject - public RefreshScheduler(TaskDao taskDao) { + public RefreshScheduler(TaskDao taskDao, @ForApplication Context context) { this.taskDao = taskDao; + this.context = context; } public void scheduleAllAlarms() { @@ -66,7 +68,6 @@ public class RefreshScheduler { } dueDate += 1000; // this is ghetto - Context context = ContextManager.getContext(); Intent intent = new Intent(context, RefreshBroadcastReceiver.class); intent.setAction(Long.toString(dueDate)); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);