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.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();
}
}

@ -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);
}
/**

@ -8,8 +8,6 @@ package com.todoroo.andlib.service;
import java.lang.reflect.Field;
import java.util.LinkedList;
/**
* Simple Dependency Injection Service for Android.
* <p>
@ -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());
}
/**

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

@ -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);
}

@ -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);
}
}

@ -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.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)
}
}

@ -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);

@ -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() {

@ -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

@ -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<Metadata> {
Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false);
}
}
Astrid2TaskProvider.notifyDatabaseModification();
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.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(),

@ -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();
}

@ -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;

@ -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);
}

@ -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));
}

@ -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> taskService;
@Inject Lazy<TagService> 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);
}
}
}

@ -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);
}
}

@ -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);
}

@ -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));

@ -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();

@ -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;
}

@ -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));

@ -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

@ -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) {

@ -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) {

@ -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 {
}
}

@ -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();
}
}

@ -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;
}
}

@ -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;
}
}

@ -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);
}

@ -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);
}

@ -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);
}

@ -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));
}
}

@ -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;
}

@ -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;
}
}

@ -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);
}

@ -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;
}
}

@ -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));
}
}

@ -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));
}
}

@ -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);
}

@ -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);
}

@ -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;
}
}

@ -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 {
}
}

@ -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);

Loading…
Cancel
Save