From c943fd1f126c94dea05586e2972dbfb054c4d139 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 9 Oct 2012 18:06:47 -0700 Subject: [PATCH 01/25] Started working on the calendar growth project --- .../astrid/gcal/CalendarAlarmReciever.java | 77 +++++++++++++++++++ .../com/todoroo/astrid/gcal/Calendars.java | 3 + 2 files changed, 80 insertions(+) create mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java new file mode 100644 index 000000000..a393a53b7 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java @@ -0,0 +1,77 @@ +package com.todoroo.astrid.gcal; + +import android.content.BroadcastReceiver; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.provider.CalendarContract; + +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; + +@SuppressWarnings("nls") +public class CalendarAlarmReciever extends BroadcastReceiver { + + public static final String TOKEN_EVENT_ID = "eventId"; + + private static final String ID_COLUMN_NAME = "_id"; + private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14; + private static final String EVENT_START_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Events.DTSTART : "dtstart"); + + private static final String[] EVENTS_PROJECTION = { + EVENT_START_COLUMN_NAME, + }; + + private static final String ATTENDEES_EVENT_ID_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.EVENT_ID : "event_id"); + private static final String ATTENDEES_NAME_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_NAME : "attendeeName"); + private static final String ATTENDEES_EMAIL_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_EMAIL: "attendeeEmail"); + + private static final String[] ATTENDEES_PROJECTION = { + ATTENDEES_NAME_COL, + ATTENDEES_EMAIL_COL, + }; + + @Override + public void onReceive(Context context, Intent intent) { + try { + ContentResolver cr = context.getContentResolver(); + long eventId = intent.getLongExtra(TOKEN_EVENT_ID, -1); + if (eventId > 0) { + Uri eventUri = Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS); + + String[] eventArg = new String[] { Long.toString(eventId) }; + Cursor event = cr.query(eventUri, + EVENTS_PROJECTION, + ID_COLUMN_NAME + " = ?", + eventArg, + null); + try { + int timeIndex = event.getColumnIndexOrThrow(EVENT_START_COLUMN_NAME); + long startTime = event.getLong(timeIndex); + long timeUntil = startTime - DateUtilities.now(); + + if (timeUntil > 0 && timeUntil < DateUtilities.ONE_MINUTE * 20) { + // Get attendees + Cursor attendees = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_ATTENDEES), + ATTENDEES_PROJECTION, + ATTENDEES_EVENT_ID_COL + " = ? ", + eventArg, + null); + try { + // Do something with attendees + } finally { + attendees.close(); + } + } + } finally { + event.close(); + } + } + } catch (IllegalArgumentException e) { // Some cursor read failed + e.printStackTrace(); + } + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java index eedd99f06..bba4fc6ec 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java @@ -27,6 +27,7 @@ public class Calendars { public static final String CALENDAR_CONTENT_CALENDARS = "calendars"; public static final String CALENDAR_CONTENT_EVENTS = "events"; + public static final String CALENDAR_CONTENT_ATTENDEES = "attendees"; private static final String ID_COLUMN_NAME = "_id"; private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14; @@ -66,6 +67,8 @@ public class Calendars { return CalendarContract.Calendars.CONTENT_URI; else if (CALENDAR_CONTENT_EVENTS.equals(table)) return CalendarContract.Events.CONTENT_URI; + else if (CALENDAR_CONTENT_ATTENDEES.equals(table)) + return CalendarContract.Attendees.CONTENT_URI; return null; } From 1d891a8c01bfb3078b5f0aea71b57c3a162a9fc3 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 10 Oct 2012 11:17:59 -0700 Subject: [PATCH 02/25] First pass at calendar alarm scheduler, some refactoring --- astrid/AndroidManifest.xml | 2 + .../astrid/gcal/CalendarAlarmReceiver.java | 72 +++++++++++++++++ .../astrid/gcal/CalendarAlarmReciever.java | 77 ------------------- .../astrid/gcal/CalendarAlarmScheduler.java | 52 +++++++++++++ .../com/todoroo/astrid/gcal/Calendars.java | 19 +++-- 5 files changed, 138 insertions(+), 84 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java delete mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index b3c66a517..6a66d3d49 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -227,6 +227,8 @@ + + diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java new file mode 100644 index 000000000..aae43b165 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java @@ -0,0 +1,72 @@ +package com.todoroo.astrid.gcal; + +import android.content.BroadcastReceiver; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; + +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.utility.Constants; + +@SuppressWarnings("nls") +public class CalendarAlarmReceiver extends BroadcastReceiver { + + public static final int REQUEST_CODE_CAL_REMINDER = 100; + public static final String BROADCAST_CALENDAR_REMINDER = Constants.PACKAGE + ".CALENDAR_EVENT"; + public static final String TOKEN_EVENT_ID = "eventId"; + + private static final String[] EVENTS_PROJECTION = { + Calendars.EVENTS_DTSTART_COL, + }; + + private static final String[] ATTENDEES_PROJECTION = { + Calendars.ATTENDEES_NAME_COL, + Calendars.ATTENDEES_EMAIL_COL, + }; + + @Override + public void onReceive(Context context, Intent intent) { + try { + ContentResolver cr = context.getContentResolver(); + long eventId = intent.getLongExtra(TOKEN_EVENT_ID, -1); + if (eventId > 0) { + Uri eventUri = Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS); + + String[] eventArg = new String[] { Long.toString(eventId) }; + Cursor event = cr.query(eventUri, + EVENTS_PROJECTION, + Calendars.ID_COLUMN_NAME + " = ?", + eventArg, + null); + try { + if (event.moveToFirst()) { + int timeIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL); + long startTime = event.getLong(timeIndex); + long timeUntil = startTime - DateUtilities.now(); + + if (timeUntil > 0 && timeUntil < DateUtilities.ONE_MINUTE * 20) { + // Get attendees + Cursor attendees = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_ATTENDEES), + ATTENDEES_PROJECTION, + Calendars.ATTENDEES_EVENT_ID_COL + " = ? ", + eventArg, + null); + try { + // Do something with attendees + } finally { + attendees.close(); + } + } + } + } finally { + event.close(); + } + } + } catch (IllegalArgumentException e) { // Some cursor read failed + e.printStackTrace(); + } + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java deleted file mode 100644 index a393a53b7..000000000 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReciever.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.todoroo.astrid.gcal; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.provider.CalendarContract; - -import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.andlib.utility.DateUtilities; - -@SuppressWarnings("nls") -public class CalendarAlarmReciever extends BroadcastReceiver { - - public static final String TOKEN_EVENT_ID = "eventId"; - - private static final String ID_COLUMN_NAME = "_id"; - private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14; - private static final String EVENT_START_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Events.DTSTART : "dtstart"); - - private static final String[] EVENTS_PROJECTION = { - EVENT_START_COLUMN_NAME, - }; - - private static final String ATTENDEES_EVENT_ID_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.EVENT_ID : "event_id"); - private static final String ATTENDEES_NAME_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_NAME : "attendeeName"); - private static final String ATTENDEES_EMAIL_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_EMAIL: "attendeeEmail"); - - private static final String[] ATTENDEES_PROJECTION = { - ATTENDEES_NAME_COL, - ATTENDEES_EMAIL_COL, - }; - - @Override - public void onReceive(Context context, Intent intent) { - try { - ContentResolver cr = context.getContentResolver(); - long eventId = intent.getLongExtra(TOKEN_EVENT_ID, -1); - if (eventId > 0) { - Uri eventUri = Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS); - - String[] eventArg = new String[] { Long.toString(eventId) }; - Cursor event = cr.query(eventUri, - EVENTS_PROJECTION, - ID_COLUMN_NAME + " = ?", - eventArg, - null); - try { - int timeIndex = event.getColumnIndexOrThrow(EVENT_START_COLUMN_NAME); - long startTime = event.getLong(timeIndex); - long timeUntil = startTime - DateUtilities.now(); - - if (timeUntil > 0 && timeUntil < DateUtilities.ONE_MINUTE * 20) { - // Get attendees - Cursor attendees = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_ATTENDEES), - ATTENDEES_PROJECTION, - ATTENDEES_EVENT_ID_COL + " = ? ", - eventArg, - null); - try { - // Do something with attendees - } finally { - attendees.close(); - } - } - } finally { - event.close(); - } - } - } catch (IllegalArgumentException e) { // Some cursor read failed - e.printStackTrace(); - } - } - -} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java new file mode 100644 index 000000000..77dcc1597 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java @@ -0,0 +1,52 @@ +package com.todoroo.astrid.gcal; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; + +import com.todoroo.andlib.utility.DateUtilities; + +@SuppressWarnings("nls") +public class CalendarAlarmScheduler { + + public static void scheduleCalendarAlarms(Context context) { + ContentResolver cr = context.getContentResolver(); + + long now = DateUtilities.now(); + + Cursor events = cr.query(Calendars.getCalendarContentUri(Calendars.CALENDAR_CONTENT_EVENTS), + new String[] { Calendars.ID_COLUMN_NAME, Calendars.EVENTS_DTSTART_COL }, + Calendars.EVENTS_DTSTART_COL + " > ? AND " + Calendars.EVENTS_DTSTART_COL + " < ?", + new String[] { Long.toString(now + DateUtilities.ONE_MINUTE * 20), Long.toString(now + DateUtilities.ONE_DAY) }, + null); + try { + if (events.moveToFirst()) { + int idIndex = events.getColumnIndex(Calendars.ID_COLUMN_NAME); + int timeIndex = events.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL); + + long start = events.getLong(timeIndex); + long id = events.getLong(idIndex); + + long alarmTime = start - DateUtilities.ONE_MINUTE * 15; + Intent eventAlarm = new Intent(context, CalendarAlarmReceiver.class); + eventAlarm.setAction(CalendarAlarmReceiver.BROADCAST_CALENDAR_REMINDER); + eventAlarm.putExtra(CalendarAlarmReceiver.TOKEN_EVENT_ID, id); + + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, + CalendarAlarmReceiver.REQUEST_CODE_CAL_REMINDER, eventAlarm, 0); + + AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + am.cancel(pendingIntent); + + am.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent); + } + } finally { + events.close(); + } + + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java index bba4fc6ec..ab3e1b7e4 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java @@ -29,22 +29,27 @@ public class Calendars { public static final String CALENDAR_CONTENT_EVENTS = "events"; public static final String CALENDAR_CONTENT_ATTENDEES = "attendees"; - private static final String ID_COLUMN_NAME = "_id"; private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14; - private static final String DISPLAY_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_DISPLAY_NAME : "displayName"); - private static final String ACCES_LEVEL_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL : "access_level"); + + public static final String ID_COLUMN_NAME = "_id"; + public static final String CALENDARS_DISPLAY_COL = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_DISPLAY_NAME : "displayName"); + public static final String CALENDARS_ACCESS_LEVEL_COL = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL : "access_level"); + public static final String EVENTS_DTSTART_COL = (USE_ICS_NAMES ? CalendarContract.Events.DTSTART : "dtstart"); + public static final String ATTENDEES_EVENT_ID_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.EVENT_ID : "event_id"); + public static final String ATTENDEES_NAME_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_NAME : "attendeeName"); + public static final String ATTENDEES_EMAIL_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_EMAIL: "attendeeEmail"); private static final String[] CALENDARS_PROJECTION = new String[] { ID_COLUMN_NAME, - DISPLAY_COLUMN_NAME, + CALENDARS_DISPLAY_COL, }; // Only show calendars that the user can modify. Access level 500 // corresponds to Calendars.CONTRIBUTOR_ACCESS - private static final String CALENDARS_WHERE = ACCES_LEVEL_COLUMN_NAME + ">= 500"; + private static final String CALENDARS_WHERE = CALENDARS_ACCESS_LEVEL_COL + ">= 500"; - private static final String CALENDARS_SORT = DISPLAY_COLUMN_NAME + " ASC"; + private static final String CALENDARS_SORT = CALENDARS_DISPLAY_COL + " ASC"; // --- api access @@ -136,7 +141,7 @@ public class Calendars { // Iterate calendars one by one, and fill up the list preference int row = 0; int idColumn = c.getColumnIndex(ID_COLUMN_NAME); - int nameColumn = c.getColumnIndex(DISPLAY_COLUMN_NAME); + int nameColumn = c.getColumnIndex(CALENDARS_DISPLAY_COL); while (c.moveToNext()) { String id = c.getString(idColumn); String name = c.getString(nameColumn); From c62c117b37e211b2efdb786b246e16635dd20e89 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 10 Oct 2012 14:34:17 -0700 Subject: [PATCH 03/25] Lots of progress + stubs for the calendar reminder activity --- astrid/AndroidManifest.xml | 4 + .../astrid/calls/MissedCallActivity.java | 4 +- .../astrid/gcal/CalendarAlarmReceiver.java | 34 +++ .../astrid/gcal/CalendarAlarmScheduler.java | 37 ++- .../astrid/gcal/CalendarReminderActivity.java | 225 ++++++++++++++++++ .../com/todoroo/astrid/gcal/Calendars.java | 1 + .../layout/astrid_calendar_reminder_view.xml | 90 +++++++ .../res/layout/calendar_reminder_activity.xml | 14 ++ astrid/res/values/strings-core.xml | 38 +++ .../astrid/service/StartupService.java | 3 + .../com/todoroo/astrid/utility/Constants.java | 2 +- 11 files changed, 437 insertions(+), 15 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java create mode 100644 astrid/res/layout/astrid_calendar_reminder_view.xml create mode 100644 astrid/res/layout/calendar_reminder_activity.xml diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 6a66d3d49..4db2257d0 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -293,6 +293,10 @@ + + + diff --git a/astrid/plugin-src/com/todoroo/astrid/calls/MissedCallActivity.java b/astrid/plugin-src/com/todoroo/astrid/calls/MissedCallActivity.java index a6337408e..632354709 100644 --- a/astrid/plugin-src/com/todoroo/astrid/calls/MissedCallActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/calls/MissedCallActivity.java @@ -168,8 +168,8 @@ public class MissedCallActivity extends Activity { ignoreSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - Intent labsPreferences = new Intent(MissedCallActivity.this, EditPreferences.class); - startActivity(labsPreferences); + Intent editPreferences = new Intent(MissedCallActivity.this, EditPreferences.class); + startActivity(editPreferences); finish(); } }); diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java index aae43b165..944ea44b0 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmReceiver.java @@ -1,11 +1,15 @@ package com.todoroo.astrid.gcal; +import java.util.ArrayList; + import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.utility.Constants; @@ -19,6 +23,7 @@ public class CalendarAlarmReceiver extends BroadcastReceiver { private static final String[] EVENTS_PROJECTION = { Calendars.EVENTS_DTSTART_COL, + Calendars.EVENTS_NAME_COL, }; private static final String[] ATTENDEES_PROJECTION = { @@ -43,6 +48,9 @@ public class CalendarAlarmReceiver extends BroadcastReceiver { try { if (event.moveToFirst()) { int timeIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL); + int titleIndex = event.getColumnIndexOrThrow(Calendars.EVENTS_NAME_COL); + + String title = event.getString(titleIndex); long startTime = event.getLong(timeIndex); long timeUntil = startTime - DateUtilities.now(); @@ -55,6 +63,32 @@ public class CalendarAlarmReceiver extends BroadcastReceiver { null); try { // Do something with attendees + int emailIndex = attendees.getColumnIndexOrThrow(Calendars.ATTENDEES_EMAIL_COL); + int nameIndex = attendees.getColumnIndexOrThrow(Calendars.ATTENDEES_NAME_COL); + + ArrayList names = new ArrayList(); + ArrayList emails = new ArrayList(); + + for (attendees.moveToFirst(); !attendees.isAfterLast(); attendees.moveToNext()) { + String name = attendees.getString(nameIndex); + String email = attendees.getString(emailIndex); + if (!TextUtils.isEmpty(email)) { + if (Constants.DEBUG) + Log.w(CalendarAlarmScheduler.TAG, "Attendee: " + name + ", email: " + email); + names.add(name); + emails.add(email); + } + } + + if (emails.size() > 0) { + Intent reminderActivity = new Intent(context, CalendarReminderActivity.class); + reminderActivity.putStringArrayListExtra(CalendarReminderActivity.TOKEN_NAMES, names); + reminderActivity.putStringArrayListExtra(CalendarReminderActivity.TOKEN_EMAILS, emails); + reminderActivity.putExtra(CalendarReminderActivity.TOKEN_EVENT_NAME, title); + reminderActivity.putExtra(CalendarReminderActivity.TOKEN_EVENT_TIME, startTime); + reminderActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + context.startActivity(reminderActivity); + } } finally { attendees.close(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java index 77dcc1597..a3115328b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarAlarmScheduler.java @@ -1,18 +1,24 @@ package com.todoroo.astrid.gcal; +import java.util.Date; + import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; +import android.util.Log; import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.utility.Constants; @SuppressWarnings("nls") public class CalendarAlarmScheduler { - public static void scheduleCalendarAlarms(Context context) { + public static final String TAG = "calendar-alarm"; + + public static void scheduleAllCalendarAlarms(Context context) { ContentResolver cr = context.getContentResolver(); long now = DateUtilities.now(); @@ -23,25 +29,32 @@ public class CalendarAlarmScheduler { new String[] { Long.toString(now + DateUtilities.ONE_MINUTE * 20), Long.toString(now + DateUtilities.ONE_DAY) }, null); try { - if (events.moveToFirst()) { + if (events.getCount() > 0) { int idIndex = events.getColumnIndex(Calendars.ID_COLUMN_NAME); int timeIndex = events.getColumnIndexOrThrow(Calendars.EVENTS_DTSTART_COL); - long start = events.getLong(timeIndex); - long id = events.getLong(idIndex); - - long alarmTime = start - DateUtilities.ONE_MINUTE * 15; Intent eventAlarm = new Intent(context, CalendarAlarmReceiver.class); eventAlarm.setAction(CalendarAlarmReceiver.BROADCAST_CALENDAR_REMINDER); - eventAlarm.putExtra(CalendarAlarmReceiver.TOKEN_EVENT_ID, id); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, - CalendarAlarmReceiver.REQUEST_CODE_CAL_REMINDER, eventAlarm, 0); + for (events.moveToFirst(); !events.isAfterLast(); events.moveToNext()) { + long start = events.getLong(timeIndex); + long id = events.getLong(idIndex); + + eventAlarm.putExtra(CalendarAlarmReceiver.TOKEN_EVENT_ID, id); + + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, + CalendarAlarmReceiver.REQUEST_CODE_CAL_REMINDER, eventAlarm, 0); + + AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + am.cancel(pendingIntent); + + long alarmTime = start - DateUtilities.ONE_MINUTE * 15; + am.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent); - AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); - am.cancel(pendingIntent); + if (Constants.DEBUG) + Log.w(TAG, "Scheduling calendar alarm for " + new Date(alarmTime)); + } - am.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent); } } finally { events.close(); diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java new file mode 100644 index 000000000..adf6e3f12 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java @@ -0,0 +1,225 @@ +package com.todoroo.astrid.gcal; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; +import com.todoroo.astrid.activity.EditPreferences; +import com.todoroo.astrid.dao.UserDao; +import com.todoroo.astrid.data.TagData; +import com.todoroo.astrid.data.User; +import com.todoroo.astrid.service.StartupService; +import com.todoroo.astrid.service.TagDataService; + +@SuppressWarnings("nls") +public class CalendarReminderActivity extends Activity { + + public static final String TOKEN_NAMES = "names"; + public static final String TOKEN_EMAILS = "emails"; + public static final String TOKEN_EVENT_NAME = "eventName"; + public static final String TOKEN_EVENT_TIME = "eventTime"; + + private static final String PREF_IGNORE_PRESSES = "calEventsIgnored"; + + // Prompt user to ignore all missed calls after this many ignore presses + private static final int IGNORE_PROMPT_COUNT = 3; + + @Autowired + private UserDao userDao; + + @Autowired + private TagDataService tagDataService; + + private ArrayList names; + private ArrayList emails; + private HashMap emailsToUsers; + private String eventName; + private long eventTime; + + private TextView ignoreButton; + private TextView createListButton; + private View dismissButton; + private View ignoreSettingsButton; + + private final OnClickListener dismissListener = new OnClickListener() { + @Override + public void onClick(View v) { + finish(); + AndroidUtilities.callOverridePendingTransition(CalendarReminderActivity.this, 0, android.R.anim.fade_out); + } + }; + + private final OnClickListener ignoreListener = new OnClickListener() { + @Override + public void onClick(final View v) { + // Check for number of ignore presses + int ignorePresses = Preferences.getInt(PREF_IGNORE_PRESSES, 0); + ignorePresses++; + if (ignorePresses == IGNORE_PROMPT_COUNT) { + DialogUtilities.okCancelCustomDialog(CalendarReminderActivity.this, + getString(R.string.CRA_ignore_title), + getString(R.string.CRA_ignore_body), + R.string.CRA_ignore_all, + R.string.CRA_ignore_this, + 0, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Preferences.setBoolean(R.string.p_field_missed_calls, false); + dismissListener.onClick(v); + } + }, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dismissListener.onClick(v); + } + }); + } else { + dismissListener.onClick(v); + } + Preferences.setInt(PREF_IGNORE_PRESSES, ignorePresses); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + new StartupService().onStartupApplication(this); + super.onCreate(savedInstanceState); + DependencyInjectionService.getInstance().inject(this); + + setContentView(R.layout.calendar_reminder_activity); + + + Intent intent = getIntent(); + names = intent.getStringArrayListExtra(TOKEN_NAMES); + emails = intent.getStringArrayListExtra(TOKEN_EMAILS); + eventName = intent.getStringExtra(TOKEN_EVENT_NAME); + eventTime = intent.getLongExtra(TOKEN_EVENT_TIME, DateUtilities.now()); + + createListButton = (TextView) findViewById(R.id.create_list); + ignoreButton = (TextView) findViewById(R.id.ignore); + ignoreSettingsButton = findViewById(R.id.ignore_settings); + dismissButton = findViewById(R.id.dismiss); + + initializeUserMap(); + + setupUi(); + + addListeners(); + } + + private void initializeUserMap() { + emailsToUsers = new HashMap(); + TodorooCursor users = userDao.query(Query.select(User.PROPERTIES).where(User.EMAIL.in(emails.toArray(new String[emails.size()])))); + try { + for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) { + User u = new User(users); + emailsToUsers.put(u.getValue(User.EMAIL), u); + } + } finally { + users.close(); + } + } + + private void setupUi() { + ((TextView) findViewById(R.id.reminder_title)) + .setText(getString(R.string.CRA_title, eventName)); + + LinearLayout root = (LinearLayout) findViewById(R.id.reminder_root); + + for (int i = 0; i < emails.size(); i++) { + String email = emails.get(i); + if (email.equals(ActFmPreferenceService.thisUser().optString("email", null))) + continue; + String displayString = email; + if (!TextUtils.isEmpty(names.get(i))) { + displayString = names.get(i); + } else if (emailsToUsers.containsKey(email)) { + User u = emailsToUsers.get(email); + displayString = u.getDisplayName(); + } + + TextView tv = new TextView(this); + tv.setText(displayString); + tv.setTextColor(getResources().getColor(android.R.color.white)); + root.addView(tv); + } + + TextView dialogView = (TextView) findViewById(R.id.reminder_message); + dialogView.setText(getString(R.string.CRA_speech_bubble)); + } + + private void addListeners() { + ignoreButton.setOnClickListener(ignoreListener); + dismissButton.setOnClickListener(dismissListener); + + ignoreSettingsButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Intent editPreferences = new Intent(CalendarReminderActivity.this, EditPreferences.class); + startActivity(editPreferences); + finish(); + } + }); + + createListButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + TagData existing = tagDataService.getTag(eventName, TagData.PROPERTIES); + if (existing != null) { + listExists(existing); + } else { + createNewList(eventName); + } + } + }); + } + + private void listExists(final TagData tag) { + DialogUtilities.okCancelCustomDialog(this, + getString(R.string.CRA_list_exists_title), + getString(R.string.CRA_list_exists_body, tag.getValue(TagData.NAME)), + R.string.CRA_create_new, + R.string.CRA_use_existing, + 0, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + createNewList(tag.getValue(TagData.NAME) + " " + + DateUtilities.getDateStringHideYear(CalendarReminderActivity.this, new Date(eventTime))); + } + }, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // use existing list + } + }); + } + + private void createNewList(String defaultName) { + // Do something + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java index ab3e1b7e4..cfdc6b4cd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/Calendars.java @@ -35,6 +35,7 @@ public class Calendars { public static final String CALENDARS_DISPLAY_COL = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_DISPLAY_NAME : "displayName"); public static final String CALENDARS_ACCESS_LEVEL_COL = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL : "access_level"); public static final String EVENTS_DTSTART_COL = (USE_ICS_NAMES ? CalendarContract.Events.DTSTART : "dtstart"); + public static final String EVENTS_NAME_COL = (USE_ICS_NAMES ? CalendarContract.Events.TITLE : "title"); public static final String ATTENDEES_EVENT_ID_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.EVENT_ID : "event_id"); public static final String ATTENDEES_NAME_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_NAME : "attendeeName"); public static final String ATTENDEES_EMAIL_COL = (USE_ICS_NAMES ? CalendarContract.Attendees.ATTENDEE_EMAIL: "attendeeEmail"); diff --git a/astrid/res/layout/astrid_calendar_reminder_view.xml b/astrid/res/layout/astrid_calendar_reminder_view.xml new file mode 100644 index 000000000..583678cbd --- /dev/null +++ b/astrid/res/layout/astrid_calendar_reminder_view.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/astrid/res/layout/calendar_reminder_activity.xml b/astrid/res/layout/calendar_reminder_activity.xml new file mode 100644 index 000000000..7c868f1a1 --- /dev/null +++ b/astrid/res/layout/calendar_reminder_activity.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 2710f29f6..04e913ba8 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -520,6 +520,44 @@ + + + + Ignore + + + Calendar event: %s + + + Ignore all calendar events? + + + You\'ve ignored several calendar events. Should Astrid stop asking you about them? + + + Ignore all events + + + Ignore this event only + + + Looks like you\'ve got a meeting coming up! Want to create a list for taking note of action items? + + + Create list + + + List already exists + + + A list named %s already exists. Do you want to use the existing list or create a new one for this event? + + + Create new + + + Use existing + diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index 283c445b2..78e743203 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -46,6 +46,7 @@ import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.gcal.CalendarAlarmScheduler; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.opencrx.OpencrxCoreUtils; @@ -191,6 +192,8 @@ public class StartupService { AstridPreferences.setCurrentVersionName(versionName); } + CalendarAlarmScheduler.scheduleAllCalendarAlarms(context); + upgradeService.performSecondaryUpgrade(context); final int finalLatestVersion = latestSetVersion; diff --git a/astrid/src/com/todoroo/astrid/utility/Constants.java b/astrid/src/com/todoroo/astrid/utility/Constants.java index 13647ee28..2bedc6ae1 100644 --- a/astrid/src/com/todoroo/astrid/utility/Constants.java +++ b/astrid/src/com/todoroo/astrid/utility/Constants.java @@ -41,7 +41,7 @@ public final class Constants { /** * Whether to turn on debugging logging and UI */ - public static final boolean DEBUG = false; + public static final boolean DEBUG = true; /** * Astrid Help URL From 20493df3759a001a48458a8d01989c0f87742227 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 10 Oct 2012 14:58:26 -0700 Subject: [PATCH 04/25] Stub the activity for creating a new list for a calendar event, finish the event reminder activity --- astrid/AndroidManifest.xml | 4 + .../astrid/gcal/CalendarReminderActivity.java | 73 +++--------- .../astrid/gcal/CreateEventListActivity.java | 108 ++++++++++++++++++ .../todoroo/astrid/tags/TagFilterExposer.java | 2 +- .../res/layout/create_event_list_activity.xml | 37 ++++++ astrid/res/values/strings-core.xml | 3 + 6 files changed, 172 insertions(+), 55 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/gcal/CreateEventListActivity.java create mode 100644 astrid/res/layout/create_event_list_activity.xml diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 4db2257d0..f440b65c2 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -297,6 +297,10 @@ + + + diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java index adf6e3f12..973348864 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CalendarReminderActivity.java @@ -1,35 +1,30 @@ package com.todoroo.astrid.gcal; -import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; -import android.widget.LinearLayout; import android.widget.TextView; import com.timsu.astrid.R; -import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; -import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; -import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.activity.EditPreferences; -import com.todoroo.astrid.dao.UserDao; +import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.data.TagData; -import com.todoroo.astrid.data.User; import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.TagDataService; +import com.todoroo.astrid.tags.TagFilterExposer; @SuppressWarnings("nls") public class CalendarReminderActivity extends Activity { @@ -44,15 +39,9 @@ public class CalendarReminderActivity extends Activity { // Prompt user to ignore all missed calls after this many ignore presses private static final int IGNORE_PROMPT_COUNT = 3; - @Autowired - private UserDao userDao; - @Autowired private TagDataService tagDataService; - private ArrayList names; - private ArrayList emails; - private HashMap emailsToUsers; private String eventName; private long eventTime; @@ -112,8 +101,6 @@ public class CalendarReminderActivity extends Activity { Intent intent = getIntent(); - names = intent.getStringArrayListExtra(TOKEN_NAMES); - emails = intent.getStringArrayListExtra(TOKEN_EMAILS); eventName = intent.getStringExtra(TOKEN_EVENT_NAME); eventTime = intent.getLongExtra(TOKEN_EVENT_TIME, DateUtilities.now()); @@ -122,50 +109,15 @@ public class CalendarReminderActivity extends Activity { ignoreSettingsButton = findViewById(R.id.ignore_settings); dismissButton = findViewById(R.id.dismiss); - initializeUserMap(); - setupUi(); addListeners(); } - private void initializeUserMap() { - emailsToUsers = new HashMap(); - TodorooCursor users = userDao.query(Query.select(User.PROPERTIES).where(User.EMAIL.in(emails.toArray(new String[emails.size()])))); - try { - for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) { - User u = new User(users); - emailsToUsers.put(u.getValue(User.EMAIL), u); - } - } finally { - users.close(); - } - } - private void setupUi() { ((TextView) findViewById(R.id.reminder_title)) .setText(getString(R.string.CRA_title, eventName)); - LinearLayout root = (LinearLayout) findViewById(R.id.reminder_root); - - for (int i = 0; i < emails.size(); i++) { - String email = emails.get(i); - if (email.equals(ActFmPreferenceService.thisUser().optString("email", null))) - continue; - String displayString = email; - if (!TextUtils.isEmpty(names.get(i))) { - displayString = names.get(i); - } else if (emailsToUsers.containsKey(email)) { - User u = emailsToUsers.get(email); - displayString = u.getDisplayName(); - } - - TextView tv = new TextView(this); - tv.setText(displayString); - tv.setTextColor(getResources().getColor(android.R.color.white)); - root.addView(tv); - } - TextView dialogView = (TextView) findViewById(R.id.reminder_message); dialogView.setText(getString(R.string.CRA_speech_bubble)); } @@ -213,13 +165,26 @@ public class CalendarReminderActivity extends Activity { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - // use existing list + FilterWithCustomIntent filter = TagFilterExposer.filterFromTagData(CalendarReminderActivity.this, tag); + + Intent listIntent = new Intent(CalendarReminderActivity.this, TaskListActivity.class); + listIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter); + listIntent.putExtras(filter.customExtras); + + startActivity(listIntent); + dismissButton.performClick(); } }); } private void createNewList(String defaultName) { - // Do something + Intent newListIntent = new Intent(this, CreateEventListActivity.class); + newListIntent.putStringArrayListExtra(TOKEN_NAMES, getIntent().getStringArrayListExtra(TOKEN_NAMES)); + newListIntent.putStringArrayListExtra(TOKEN_EMAILS, getIntent().getStringArrayListExtra(TOKEN_EMAILS)); + newListIntent.putExtra(CreateEventListActivity.TOKEN_LIST_NAME, defaultName); + + startActivity(newListIntent); + dismissButton.performClick(); // finish with animation } } diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/CreateEventListActivity.java b/astrid/plugin-src/com/todoroo/astrid/gcal/CreateEventListActivity.java new file mode 100644 index 000000000..065c652e7 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/CreateEventListActivity.java @@ -0,0 +1,108 @@ +package com.todoroo.astrid.gcal; + +import java.util.ArrayList; +import java.util.HashMap; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Query; +import com.todoroo.astrid.dao.UserDao; +import com.todoroo.astrid.data.User; + +public class CreateEventListActivity extends Activity { + + public static final String TOKEN_LIST_NAME = "listName"; //$NON-NLS-1$ + + @Autowired + private UserDao userDao; + + private ArrayList names; + private ArrayList emails; + private HashMap emailsToUsers; + + private Button saveButton; + private Button cancelButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + DependencyInjectionService.getInstance().inject(this); + setContentView(R.layout.create_event_list_activity); + + saveButton = (Button) findViewById(R.id.save); + cancelButton = (Button) findViewById(R.id.cancel); + + Intent intent = getIntent(); + names = intent.getStringArrayListExtra(CalendarReminderActivity.TOKEN_NAMES); + emails = intent.getStringArrayListExtra(CalendarReminderActivity.TOKEN_EMAILS); + + initializeUserMap(); + + addListeners(); + } + + private void initializeUserMap() { + emailsToUsers = new HashMap(); + TodorooCursor users = userDao.query(Query.select(User.PROPERTIES).where(User.EMAIL.in(emails.toArray(new String[emails.size()])))); + try { + for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) { + User u = new User(users); + emailsToUsers.put(u.getValue(User.EMAIL), u); + } + } finally { + users.close(); + } + } + + private void addListeners() { + cancelButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + saveButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + save(); + } + }); + } + + private void save() { + // Perform save + } + + // private void maybeDoStuff() { + // LinearLayout root = (LinearLayout) findViewById(R.id.reminder_root); + // + // for (int i = 0; i < emails.size(); i++) { + // String email = emails.get(i); + // if (email.equals(ActFmPreferenceService.thisUser().optString("email", null))) + // continue; + // String displayString = email; + // if (!TextUtils.isEmpty(names.get(i))) { + // displayString = names.get(i); + // } else if (emailsToUsers.containsKey(email)) { + // User u = emailsToUsers.get(email); + // displayString = u.getDisplayName(); + // } + // + // TextView tv = new TextView(this); + // tv.setText(displayString); + // tv.setTextColor(getResources().getColor(android.R.color.white)); + // root.addView(tv); + // } + // } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index bcbd4db6e..e3ce8bba4 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -115,7 +115,7 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE } /** Create a filter from tag data object */ - public static Filter filterFromTagData(Context context, TagData tagData) { + public static FilterWithCustomIntent filterFromTagData(Context context, TagData tagData) { Tag tag = new Tag(tagData); return filterFromTag(context, tag, TaskCriteria.activeAndVisible()); } diff --git a/astrid/res/layout/create_event_list_activity.xml b/astrid/res/layout/create_event_list_activity.xml new file mode 100644 index 000000000..6bf96fafb --- /dev/null +++ b/astrid/res/layout/create_event_list_activity.xml @@ -0,0 +1,37 @@ + + + + + + + + + +