Inject Notifications

Remove TaskListContextMenuExtensionLoader, TaskContextActionExposer
pull/189/head
Alex Baker 10 years ago
parent fa6060a40c
commit 7c90ac7aeb

@ -149,12 +149,6 @@ public class AstridApiConstants {
// --- Actions API
/**
* Action name for intents to be displayed on task context menu
* <li> EXTRAS_TASK_ID id of the task
*/
public static final String ACTION_TASK_CONTEXT_MENU = API_PACKAGE + ".CONTEXT_MENU";
/**
* Action name for intents to be displayed on Astrid's task list menu
* <li> EXTRAS_ADDON your add-on identifier

@ -57,7 +57,6 @@ import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskListMetadataDao;
@ -68,10 +67,6 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.data.TaskListMetadata;
import com.todoroo.astrid.helper.SyncActionHelper;
import com.todoroo.astrid.helper.TaskListContextMenuExtensionLoader;
import com.todoroo.astrid.helper.TaskListContextMenuExtensionLoader.ContextMenuItem;
import com.todoroo.astrid.reminders.MakeNotification;
import com.todoroo.astrid.reminders.WhenReminder;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService;
@ -130,8 +125,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
protected static final int CONTEXT_MENU_DELETE_TASK_ID = R.string.TAd_contextDeleteTask;
protected static final int CONTEXT_MENU_UNDELETE_TASK_ID = R.string.TAd_contextUndeleteTask;
protected static final int CONTEXT_MENU_PURGE_TASK_ID = R.string.TAd_contextPurgeTask;
protected static final int CONTEXT_MENU_BROADCAST_INTENT_ID = Menu.FIRST + 25;
protected static final int CONTEXT_MENU_PLUGIN_ID_FIRST = Menu.FIRST + 26;
// --- constants
@ -147,11 +140,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
@Inject TaskListMetadataDao taskListMetadataDao;
@Inject SyncV2Service syncService;
private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] {
new MakeNotification(),
new WhenReminder(),
};
protected Resources resources;
protected TaskAdapter taskAdapter = null;
protected DetailReceiver detailReceiver = new DetailReceiver();
@ -169,8 +157,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
protected boolean isTodayFilter;
protected TaskListMetadata taskListMetadata;
private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader();
// --- fragment handling variables
protected OnTaskListItemClickedListener mListener;
private boolean mDualFragments = false;
@ -347,8 +333,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
setUpTaskList();
((AstridActivity) getActivity()).setupActivityFragment(getActiveTagData());
contextMenuExtensionLoader.loadInNewThread(getActivity());
}
protected void initializeTaskListMetadata() {
@ -888,37 +872,19 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
Task task = ((ViewHolder) adapterInfo.targetView.getTag()).task;
int id = (int) task.getId();
menu.setHeaderTitle(task.getTitle());
if (task.isDeleted()) {
menu.add(id, CONTEXT_MENU_UNDELETE_TASK_ID, Menu.NONE,
R.string.TAd_contextUndeleteTask);
menu.add(id, CONTEXT_MENU_PURGE_TASK_ID, Menu.NONE,
R.string.TAd_contextPurgeTask);
menu.add(id, CONTEXT_MENU_UNDELETE_TASK_ID, Menu.NONE, R.string.TAd_contextUndeleteTask);
menu.add(id, CONTEXT_MENU_PURGE_TASK_ID, Menu.NONE, R.string.TAd_contextPurgeTask);
} else {
menu.add(id, CONTEXT_MENU_EDIT_TASK_ID, Menu.NONE,
R.string.TAd_contextEditTask);
menu.add(id, CONTEXT_MENU_COPY_TASK_ID, Menu.NONE,
R.string.TAd_contextCopyTask);
long taskId = task.getId();
for (ContextMenuItem item : contextMenuExtensionLoader.getList()) {
android.view.MenuItem menuItem = menu.add(id,
CONTEXT_MENU_BROADCAST_INTENT_ID, Menu.NONE, item.title);
item.intent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
menuItem.setIntent(item.intent);
}
menu.add(id, CONTEXT_MENU_DELETE_TASK_ID, Menu.NONE,
R.string.TAd_contextDeleteTask);
menu.add(id, CONTEXT_MENU_EDIT_TASK_ID, Menu.NONE, R.string.TAd_contextEditTask);
menu.add(id, CONTEXT_MENU_COPY_TASK_ID, Menu.NONE, R.string.TAd_contextCopyTask);
menu.add(id, CONTEXT_MENU_DELETE_TASK_ID, Menu.NONE, R.string.TAd_contextDeleteTask);
}
}
@ -989,7 +955,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
Intent intent;
long itemId;
if (!isCurrentTaskListFragment()) {
@ -1004,21 +969,14 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
switch (item.getItemId()) {
// --- context menu items
case CONTEXT_MENU_BROADCAST_INTENT_ID: {
intent = item.getIntent();
getActivity().sendBroadcast(intent);
return true;
}
case CONTEXT_MENU_EDIT_TASK_ID: {
case CONTEXT_MENU_EDIT_TASK_ID:
itemId = item.getGroupId();
mListener.onTaskListItemClicked(itemId);
return true;
}
case CONTEXT_MENU_COPY_TASK_ID: {
case CONTEXT_MENU_COPY_TASK_ID:
itemId = item.getGroupId();
duplicateTask(itemId);
return true;
}
case CONTEXT_MENU_DELETE_TASK_ID: {
itemId = item.getGroupId();
Task task = taskService.fetchById(itemId, Task.ID, Task.UUID);
@ -1045,20 +1003,8 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
loadTaskListContent(true);
return true;
}
default: {
if (item.getItemId() < CONTEXT_MENU_PLUGIN_ID_FIRST) {
return false;
}
if (item.getItemId() - CONTEXT_MENU_PLUGIN_ID_FIRST >= contextItemExposers.length) {
return false;
}
AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) item.getMenuInfo();
Task task = ((ViewHolder) adapterInfo.targetView.getTag()).task;
contextItemExposers[item.getItemId() - CONTEXT_MENU_PLUGIN_ID_FIRST].invoke(task);
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}

@ -1,26 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.api;
import com.todoroo.astrid.data.Task;
/**
* API for exposing context menu items associated with a task.
*
* Due to the limitations of the Android platform, this is currently
* internal-use only, though if it can be done well, I would be open to creating
* an external API. Internal API for exposing task decorations
*
* @author Tim Su <tim@todoroo.com>
*
*/
public interface TaskContextActionExposer {
/**
* Call context menu action
*/
public void invoke(Task task);
}

@ -1,61 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.helper;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import com.todoroo.astrid.api.AstridApiConstants;
import java.util.List;
public class TaskListContextMenuExtensionLoader {
public static class ContextMenuItem {
public CharSequence title;
public Intent intent;
}
private ContextMenuItem[] contextMenuItemCache = new ContextMenuItem[0];
public void loadContextMenuIntents(Context context) {
Intent queryIntent = new Intent(AstridApiConstants.ACTION_TASK_CONTEXT_MENU);
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfoList = pm.queryBroadcastReceivers(queryIntent,
PackageManager.GET_META_DATA);
int length = resolveInfoList.size();
contextMenuItemCache = new ContextMenuItem[length];
for(int i = 0; i < length; i++) {
ResolveInfo resolveInfo = resolveInfoList.get(i);
ContextMenuItem item = new ContextMenuItem();
item.intent = new Intent(AstridApiConstants.ACTION_TASK_CONTEXT_MENU);
item.intent.setClassName(resolveInfo.activityInfo.packageName,
resolveInfo.activityInfo.name);
item.title = resolveInfo.loadLabel(pm);
contextMenuItemCache[i] = item;
}
}
public void loadInNewThread(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
loadContextMenuIntents(context);
}
}).start();
}
public ContextMenuItem[] getList() {
return contextMenuItemCache;
}
}

@ -1,13 +0,0 @@
package com.todoroo.astrid.reminders;
import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.data.Task;
public class MakeNotification implements TaskContextActionExposer {
@Override
public void invoke(Task task) {
new Notifications().showTaskNotification(task.getId(),
ReminderService.TYPE_SNOOZE, "test reminder");
}
}

@ -19,9 +19,7 @@ import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.NotificationManager;
import com.todoroo.andlib.service.NotificationManager.AndroidNotificationManager;
import com.todoroo.andlib.sql.QueryTemplate;
@ -35,7 +33,6 @@ import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceOutputService;
@ -44,14 +41,17 @@ import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.injection.InjectingBroadcastReceiver;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
public class Notifications extends BroadcastReceiver {
public class Notifications extends InjectingBroadcastReceiver {
private static final Logger log = LoggerFactory.getLogger(Notifications.class);
@ -81,24 +81,18 @@ public class Notifications extends BroadcastReceiver {
// --- instance variables
@Autowired private TaskDao taskDao;
@Inject TaskDao taskDao;
public static NotificationManager notificationManager = null;
private static boolean forceNotificationManager = false;
// --- alarm handling
static {
AstridDependencyInjector.initialize();
}
public Notifications() {
DependencyInjectionService.getInstance().inject(this);
}
@Override
/** Alarm intent */
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
ContextManager.setContext(context);
long id = intent.getLongExtra(ID_KEY, 0);
@ -142,7 +136,7 @@ public class Notifications extends BroadcastReceiver {
* Show a new notification about the given task. Returns false if there was
* some sort of error or the alarm should be disabled.
*/
public boolean showTaskNotification(long id, int type, String reminder) {
private boolean showTaskNotification(long id, int type, String reminder) {
Task task;
try {
task = taskDao.fetch(id, Task.ID, Task.TITLE, Task.HIDE_UNTIL, Task.COMPLETION_DATE,

@ -1,34 +0,0 @@
package com.todoroo.astrid.reminders;
import android.widget.Toast;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.data.Task;
import static org.tasks.date.DateTimeUtils.newDate;
public class WhenReminder implements TaskContextActionExposer {
@Override
public void invoke(Task task) {
ReminderService.AlarmScheduler original = ReminderService.getInstance().getScheduler();
ReminderService.getInstance().setScheduler(new ReminderService.AlarmScheduler() {
@Override
public void createAlarm(Task theTask, long time, int type) {
if(time == 0 || time == Long.MAX_VALUE) {
return;
}
Toast.makeText(ContextManager.getContext(), "Scheduled Alarm: " +
newDate(time), Toast.LENGTH_LONG).show();
ReminderService.getInstance().setScheduler(null);
}
});
ReminderService.getInstance().scheduleAlarm(task);
if(ReminderService.getInstance().getScheduler() != null) {
Toast.makeText(ContextManager.getContext(), "No alarms", Toast.LENGTH_LONG).show();
}
ReminderService.getInstance().setScheduler(original);
}
}

@ -1,5 +1,6 @@
package org.tasks.injection;
import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.scheduling.RefreshBroadcastReceiver;
@ -9,7 +10,8 @@ import dagger.Module;
@Module(library = true,
injects = {
RefreshBroadcastReceiver.class,
TasksWidget.class
TasksWidget.class,
Notifications.class
})
public class BroadcastModule {
}

Loading…
Cancel
Save