From 34ee32f5dd353ff4f5717edc9a6d9bc33eba6fd0 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Thu, 15 Jul 2010 03:41:57 -0700 Subject: [PATCH] Various improvements. All over, improvements. --- astrid/AndroidManifest.xml | 3 +- .../astrid/api/SynchronizationProvider.java | 11 ++- astrid/astrid.launch | 2 +- .../andlib/utility/AndroidUtilities.java | 8 +- .../andlib/widget/TodorooPreferences.java | 13 +-- .../astrid/reminders/Notifications.java | 11 +-- .../todoroo/astrid/rmilk/MilkPreferences.java | 40 +++----- .../astrid/rmilk/data/MilkDataService.java | 7 +- .../astrid/rmilk/sync/RTMSyncProvider.java | 14 ++- astrid/res/drawable/ic_menu_rmilk.png | Bin 0 -> 2656 bytes astrid/res/layout/rmilk_status_preference.xml | 61 ++++++++++++ astrid/res/values/strings-rmilk.xml | 30 ++---- astrid/res/xml/preferences_rmilk.xml | 5 +- .../astrid/activity/ShortcutActivity.java | 93 ++++++++++++++++++ .../astrid/activity/TaskListActivity.java | 16 +-- .../todoroo/astrid/adapter/TaskAdapter.java | 12 ++- 16 files changed, 238 insertions(+), 88 deletions(-) create mode 100644 astrid/res/drawable/ic_menu_rmilk.png create mode 100644 astrid/res/layout/rmilk_status_preference.xml create mode 100644 astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 0cb66c6b9..a13c5f2eb 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -255,9 +255,10 @@ - + diff --git a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java index 45f1f5e82..742a1bcc9 100644 --- a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java +++ b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java @@ -49,6 +49,12 @@ public abstract class SynchronizationProvider { */ abstract protected void initiate(Context context); + /** + * @param context + * @return title of notification + */ + abstract protected String getNotificationTitle(Context context); + /** * Push variables from given task to the remote server. * @@ -103,6 +109,7 @@ public abstract class SynchronizationProvider { private final Notification notification; private PendingIntent notificationIntent; + private String notificationTitle; public SynchronizationProvider() { DependencyInjectionService.getInstance().inject(this); @@ -111,10 +118,12 @@ public abstract class SynchronizationProvider { int icon = android.R.drawable.stat_notify_sync; long when = System.currentTimeMillis(); notification = new Notification(icon, null, when); + notification.flags |= Notification.FLAG_ONGOING_EVENT; } public void synchronize(final Context context) { // display notification + notificationTitle = getNotificationTitle(context); notificationIntent = PendingIntent.getActivity(context, 0, new Intent(), 0); postUpdate(context, context.getString(R.string.SyP_progress_starting)); final NotificationManager nm = new NotificationManager.AndroidNotificationManager(context); @@ -149,7 +158,7 @@ public abstract class SynchronizationProvider { */ protected void postUpdate(Context context, String string) { notification.setLatestEventInfo(context, - context.getString(R.string.rmilk_notification_title), string, notificationIntent); + notificationTitle, string, notificationIntent); } // --- synchronization logic diff --git a/astrid/astrid.launch b/astrid/astrid.launch index cb6cda0f4..e1e654a56 100644 --- a/astrid/astrid.launch +++ b/astrid/astrid.launch @@ -4,7 +4,7 @@ - + diff --git a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java index dd74e2256..54669eef5 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java @@ -77,10 +77,14 @@ public class AndroidUtilities { * * @param context * @param intent + * @param request request code. if negative, no request. */ - public static void startExternalIntent(Context context, Intent intent) { + public static void startExternalIntent(Context context, Intent intent, int request) { try { - context.startActivity(intent); + if(request > -1 && context instanceof Activity) + ((Activity)context).startActivityForResult(intent, request); + else + context.startActivity(intent); } catch (SecurityException e) { ExceptionHelper helper = new ExceptionHelper(); helper.exceptionService.displayAndReportError(context, diff --git a/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java b/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java index adc082fec..83e65005c 100644 --- a/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java +++ b/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java @@ -3,7 +3,6 @@ */ package com.todoroo.andlib.widget; -import android.content.Intent; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; @@ -11,7 +10,6 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; -import android.preference.PreferenceScreen; import android.preference.RingtonePreference; import android.preference.Preference.OnPreferenceChangeListener; @@ -40,10 +38,6 @@ abstract public class TodorooPreferences extends PreferenceActivity { addPreferencesFromResource(getPreferenceResource()); DependencyInjectionService.getInstance().inject(this); - - PreferenceScreen screen = getPreferenceScreen(); - initializePreference(screen); - } protected void initializePreference(Preference preference) { @@ -76,8 +70,11 @@ abstract public class TodorooPreferences extends PreferenceActivity { } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - initializePreference(getPreferenceScreen()); + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if(hasFocus) { + initializePreference(getPreferenceScreen()); + } } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java index d6d358dd4..62714a13b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java @@ -2,7 +2,6 @@ package com.todoroo.astrid.reminders; import java.util.Date; -import android.app.Activity; import android.app.Notification; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -15,8 +14,6 @@ import android.net.Uri; import android.util.Log; import com.timsu.astrid.R; -import com.timsu.astrid.data.task.TaskIdentifier; -import com.timsu.astrid.utilities.Constants; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; @@ -27,6 +24,7 @@ import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.model.Task; import com.todoroo.astrid.service.AstridDependencyInjector; +import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Preferences; public class Notifications extends BroadcastReceiver { @@ -88,13 +86,6 @@ public class Notifications extends BroadcastReceiver { // --- notification creation - /** Clear notifications associated with this application */ - public static void clearAllNotifications(Context context, TaskIdentifier taskId) { - NotificationManager nm = (NotificationManager) - context.getSystemService(Activity.NOTIFICATION_SERVICE); - nm.cancel((int)taskId.getId()); - } - /** @return a random reminder string */ static String getRandomReminder(String[] reminders) { int next = ReminderService.random.nextInt(reminders.length); diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java index 72c72eaf8..68a0def3f 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java @@ -9,8 +9,6 @@ import android.graphics.Color; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.view.View; -import android.view.ViewGroup.OnHierarchyChangeListener; -import android.widget.ListView; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; @@ -60,16 +58,6 @@ public class MilkPreferences extends TodorooPreferences { r.getStringArray(R.array.rmilk_MPr_interval_entries)[index])); } - // shortcut - else if (r.getString(R.string.rmilk_MPr_shortcut_key).equals( - preference.getKey())) { - if ((Boolean) value) { - preference.setSummary(R.string.rmilk_MPr_shortcut_desc_enabled); - } else { - preference.setSummary(R.string.rmilk_MPr_shortcut_desc_disabled); - } - } - // status else if (r.getString(R.string.rmilk_MPr_status_key).equals(preference.getKey())) { boolean loggedIn = Utilities.isLoggedIn(); @@ -94,7 +82,7 @@ public class MilkPreferences extends TodorooPreferences { DateUtilities.getDateWithTimeFormat(MilkPreferences.this). format(new Date(Utilities.getLastAttemptedSyncDate()))); if(Utilities.getLastSyncDate() > 0) { - subtitle = r.getString(R.string.rmilk_status_success, + subtitle = r.getString(R.string.rmilk_status_failed_subtitle, DateUtilities.getDateWithTimeFormat(MilkPreferences.this). format(new Date(Utilities.getLastSyncDate()))); } @@ -107,25 +95,27 @@ public class MilkPreferences extends TodorooPreferences { return true; } }); - } else { + } else if(Utilities.getLastSyncDate() > 0) { status = r.getString(R.string.rmilk_status_success, DateUtilities.getDateWithTimeFormat(MilkPreferences.this). format(new Date(Utilities.getLastSyncDate()))); statusColor = Color.rgb(0, 100, 0); + } else { + status = r.getString(R.string.rmilk_status_never); + statusColor = Color.rgb(0, 0, 100); + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference p) { + new RTMSyncProvider().synchronize(MilkPreferences.this); + return true; + } + }); } preference.setTitle(status); preference.setSummary(subtitle); - final int statusColorSetting = statusColor; - getListView().setOnHierarchyChangeListener(new OnHierarchyChangeListener() { - public void onChildViewRemoved(View arg0, View arg1) { - // - } - public void onChildViewAdded(View parent, View child) { - if(((ListView)parent).getChildCount() == 2) { - child.setBackgroundColor(statusColorSetting); - } - } - }); + + View view = findViewById(R.id.status); + if(view != null) + view.setBackgroundColor(statusColor); } // sync button diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java index 8a3261341..866b89e4c 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java @@ -126,7 +126,8 @@ public final class MilkDataService { return taskDao.query(Query.select(Task.ID).where(Criterion.none)); return taskDao.query(Query.select(properties).join(METADATA_JOIN). - where(Task.MODIFICATION_DATE.gt(lastSyncDate))); + where(Criterion.and(MetadataCriteria.withKey(METADATA_KEY), + Task.MODIFICATION_DATE.gt(lastSyncDate)))); } /** @@ -137,7 +138,7 @@ public final class MilkDataService { if(task.getId() != Task.NO_ID) return; TodorooCursor cursor = taskDao.query(Query.select(Task.ID). - join(METADATA_JOIN).where(Criterion.and(LIST_ID.eq(task.getValue(LIST_ID)), + join(METADATA_JOIN).where(Criterion.and(MetadataCriteria.withKey(METADATA_KEY), TASK_SERIES_ID.eq(task.getValue(TASK_SERIES_ID)), TASK_ID.eq(task.getValue(TASK_ID))))); try { @@ -296,7 +297,7 @@ public final class MilkDataService { MilkList model = new MilkList(); MilkList inbox = null; for(Map.Entry list : lists.getLists().entrySet()) { - if(list.getValue().isSmart()) + if(list.getValue().isSmart() || "All Tasks".equals(list.getValue().getName())) //$NON-NLS-1$ continue; model.setValue(MilkList.ID, Long.parseLong(list.getValue().getId())); model.setValue(MilkList.NAME, list.getValue().getName()); diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java index aa305be0c..d863edc2d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java @@ -263,7 +263,12 @@ public class RTMSyncProvider extends SynchronizationProvider { } SyncData syncData = populateSyncData(remoteChanges); - synchronizeTasks(syncData); + try { + synchronizeTasks(syncData); + } finally { + syncData.localCreated.close(); + syncData.localUpdated.close(); + } Utilities.recordSuccessfulSync(); @@ -279,6 +284,11 @@ public class RTMSyncProvider extends SynchronizationProvider { // ------------------------------------------------------- helper methods // ---------------------------------------------------------------------- + @Override + protected String getNotificationTitle(Context context) { + return context.getString(R.string.rmilk_notification_title); + } + /** * Populate SyncData data structure */ @@ -447,6 +457,8 @@ public class RTMSyncProvider extends SynchronizationProvider { @Override protected Task read(Task task) throws IOException { + if(task.getValue(MilkDataService.TASK_SERIES_ID) == 0) + throw new ServiceInternalException("Tried to read an invalid task"); //$NON-NLS-1$ RtmTaskSeries rtmTask = rtmService.tasks_getTask(Long.toString(task.getValue(MilkDataService.TASK_SERIES_ID)), task.getValue(Task.TITLE)); if(rtmTask != null) diff --git a/astrid/res/drawable/ic_menu_rmilk.png b/astrid/res/drawable/ic_menu_rmilk.png new file mode 100644 index 0000000000000000000000000000000000000000..12f9cf24a78ac4d40789783e21bcab25be4d9d16 GIT binary patch literal 2656 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 O0000 + + + + + + + + + + + + + + + + + diff --git a/astrid/res/values/strings-rmilk.xml b/astrid/res/values/strings-rmilk.xml index 4cf5bc029..9c9205ddf 100644 --- a/astrid/res/values/strings-rmilk.xml +++ b/astrid/res/values/strings-rmilk.xml @@ -57,7 +57,11 @@ Last Sync: %s - Sync Failed On: %s + Failed On: %s + + Last Successful Sync: %s + + Never Synchronized! Options @@ -71,15 +75,6 @@ rmilk_interval - - Main Menu Shortcut - - Shortcut will be shown in main menu - - Shortcut will be hidden in main menu - - rmilk_shortcut - Wifi Only Setting @@ -123,23 +118,10 @@ Error Message: %s - - Sync Error! Sorry for the inconvenience! Error: - Sync: Up to date! - %s Results - Summary - Astrid Tasks: - Summary - Remote Server: - Created: %d - Updated: %d - Deleted: %d - Merged: %d - Astrid: Remember the Milk + Log out / clear synchronization data? - Last Sync Date: %s - Last AutoSync Attempt: %s - never Connection Error! Check your Internet connection, or maybe RTM servers (status.rememberthemilk.com), for possible solutions. diff --git a/astrid/res/xml/preferences_rmilk.xml b/astrid/res/xml/preferences_rmilk.xml index 30ddde04e..d1e22544b 100644 --- a/astrid/res/xml/preferences_rmilk.xml +++ b/astrid/res/xml/preferences_rmilk.xml @@ -6,6 +6,7 @@ android:title="@string/rmilk_MPr_group_status"> @@ -21,10 +22,6 @@ android:entryValues="@array/rmilk_MPr_interval_values" android:title="@string/rmilk_MPr_interval_title" /> - -