Awesome better remember the milk

pull/14/head
Tim Su 14 years ago
parent 115bda98f6
commit da8dcc0432

@ -232,12 +232,18 @@
android:taskAffinity="" /> android:taskAffinity="" />
<!-- rmilk --> <!-- rmilk -->
<receiver android:name="com.todoroo.astrid.rmilk.FilterExposer"> <receiver android:name="com.todoroo.astrid.rmilk.MilkFilterExposer">
<intent-filter> <intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_FILTERS" /> <action android:name="com.todoroo.astrid.REQUEST_FILTERS" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name="com.todoroo.astrid.rmilk.MilkDetailExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_DETAILS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name="com.todoroo.astrid.rmilk.MilkLoginActivity" <activity android:name="com.todoroo.astrid.rmilk.MilkLoginActivity"
android:theme="@style/Theme" /> android:theme="@style/Theme" />
<activity android:name="com.todoroo.astrid.rmilk.MilkPreferences" <activity android:name="com.todoroo.astrid.rmilk.MilkPreferences"

@ -15,11 +15,6 @@ import android.os.Parcelable;
*/ */
public class FilterCategory extends FilterListItem { public class FilterCategory extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/** /**
* {@link Filter}s contained by this category * {@link Filter}s contained by this category
*/ */
@ -27,17 +22,12 @@ public class FilterCategory extends FilterListItem {
/** /**
* Constructor for creating a new FilterCategory * Constructor for creating a new FilterCategory
*
* @param plugin
* {@link Addon} identifier that encompasses object
* @param listingTitle * @param listingTitle
* Title of this item as displayed on the lists page, e.g. Inbox * Title of this item as displayed on the lists page, e.g. Inbox
* @param children * @param children
* filters belonging to this category * filters belonging to this category
*/ */
public FilterCategory(String plugin, String listingTitle, public FilterCategory(String listingTitle, Filter[] children) {
Filter[] children) {
this.plugin = plugin;
this.listingTitle = listingTitle; this.listingTitle = listingTitle;
this.children = children; this.children = children;
} }
@ -48,8 +38,8 @@ public class FilterCategory extends FilterListItem {
* @param plugin * @param plugin
* {@link Addon} identifier that encompasses object * {@link Addon} identifier that encompasses object
*/ */
protected FilterCategory(String plugin) { protected FilterCategory() {
this.plugin = plugin; //
} }
// --- parcelable // --- parcelable
@ -66,7 +56,6 @@ public class FilterCategory extends FilterListItem {
*/ */
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
super.writeToParcel(dest, flags); super.writeToParcel(dest, flags);
dest.writeParcelableArray(children, 0); dest.writeParcelableArray(children, 0);
} }
@ -80,7 +69,7 @@ public class FilterCategory extends FilterListItem {
* {@inheritDoc} * {@inheritDoc}
*/ */
public FilterCategory createFromParcel(Parcel source) { public FilterCategory createFromParcel(Parcel source) {
FilterCategory item = new FilterCategory(source.readString()); FilterCategory item = new FilterCategory();
item.readFromParcel(source); item.readFromParcel(source);
Parcelable[] parcelableChildren = source.readParcelableArray( Parcelable[] parcelableChildren = source.readParcelableArray(

@ -14,22 +14,13 @@ import android.os.Parcelable;
*/ */
public class FilterListHeader extends FilterListItem { public class FilterListHeader extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/** /**
* Constructor for creating a new FilterListHeader * Constructor for creating a new FilterListHeader
*
* @param plugin
* {@link Addon} identifier that encompasses object
* @param listingTitle * @param listingTitle
* @param listingIconResource * @param listingIconResource
* @param priority * @param priority
*/ */
public FilterListHeader(String plugin, String listingTitle) { public FilterListHeader(String listingTitle) {
this.plugin = plugin;
this.listingTitle = listingTitle; this.listingTitle = listingTitle;
} }
@ -39,8 +30,8 @@ public class FilterListHeader extends FilterListItem {
* @param plugin * @param plugin
* {@link Addon} identifier that encompasses object * {@link Addon} identifier that encompasses object
*/ */
protected FilterListHeader(String plugin) { protected FilterListHeader() {
this.plugin = plugin; //
} }
// --- parcelable // --- parcelable
@ -51,14 +42,13 @@ public class FilterListHeader extends FilterListItem {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(plugin);
super.writeToParcel(dest, flags); super.writeToParcel(dest, flags);
} }
public static final Parcelable.Creator<FilterListHeader> CREATOR = new Parcelable.Creator<FilterListHeader>() { public static final Parcelable.Creator<FilterListHeader> CREATOR = new Parcelable.Creator<FilterListHeader>() {
public FilterListHeader createFromParcel(Parcel source) { public FilterListHeader createFromParcel(Parcel source) {
FilterListHeader item = new FilterListHeader(source.readString()); FilterListHeader item = new FilterListHeader();
item.readFromParcel(source); item.readFromParcel(source);
return item; return item;
} }

@ -45,8 +45,9 @@ public abstract class SynchronizationProvider {
/** /**
* Perform authenticate and other pre-synchronization steps, then * Perform authenticate and other pre-synchronization steps, then
* synchronize. * synchronize.
* @param context either the parent activity, or a background service
*/ */
abstract protected void initiate(); abstract protected void initiate(Context context);
/** /**
* Push variables from given task to the remote server. * Push variables from given task to the remote server.
@ -112,9 +113,7 @@ public abstract class SynchronizationProvider {
notification = new Notification(icon, null, when); notification = new Notification(icon, null, when);
} }
public void synchronize() { public void synchronize(final Context context) {
Context context = ContextManager.getContext();
// display notification // display notification
notificationIntent = PendingIntent.getActivity(context, 0, new Intent(), 0); notificationIntent = PendingIntent.getActivity(context, 0, new Intent(), 0);
postUpdate(context, context.getString(R.string.SyP_progress_starting)); postUpdate(context, context.getString(R.string.SyP_progress_starting));
@ -125,7 +124,7 @@ public abstract class SynchronizationProvider {
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
try { try {
initiate(); initiate(context);
} finally { } finally {
nm.cancel(Constants.NOTIFICATION_SYNC); nm.cancel(Constants.NOTIFICATION_SYNC);
} }

@ -127,7 +127,7 @@ public class DialogUtilities {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
public void run() { public void run() {
new AlertDialog.Builder(activity) new AlertDialog.Builder(activity)
.setTitle(informationDialogTitleResource) .setTitle(confirmDialogTitleResource)
.setMessage(text) .setMessage(text)
.setIcon(android.R.drawable.ic_dialog_alert) .setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.ok, okListener) .setPositiveButton(android.R.string.ok, okListener)

@ -3,16 +3,19 @@
*/ */
package com.todoroo.andlib.widget; package com.todoroo.andlib.widget;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.preference.RingtonePreference; import android.preference.RingtonePreference;
import android.preference.Preference.OnPreferenceChangeListener;
import com.todoroo.andlib.service.DependencyInjectionService;
/** /**
* Displays a preference screen for users to edit their preferences. Override * Displays a preference screen for users to edit their preferences. Override
@ -36,13 +39,14 @@ abstract public class TodorooPreferences extends PreferenceActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
addPreferencesFromResource(getPreferenceResource()); addPreferencesFromResource(getPreferenceResource());
DependencyInjectionService.getInstance().inject(this);
PreferenceScreen screen = getPreferenceScreen(); PreferenceScreen screen = getPreferenceScreen();
initializePreference(screen); initializePreference(screen);
} }
private void initializePreference(Preference preference) { protected void initializePreference(Preference preference) {
if(preference instanceof PreferenceGroup) { if(preference instanceof PreferenceGroup) {
PreferenceGroup group = (PreferenceGroup)preference; PreferenceGroup group = (PreferenceGroup)preference;
for(int i = 0; i < group.getPreferenceCount(); i++) { for(int i = 0; i < group.getPreferenceCount(); i++) {
@ -56,11 +60,10 @@ abstract public class TodorooPreferences extends PreferenceActivity {
value = ((CheckBoxPreference)preference).isChecked(); value = ((CheckBoxPreference)preference).isChecked();
else if(preference instanceof EditTextPreference) else if(preference instanceof EditTextPreference)
value = ((EditTextPreference)preference).getText(); value = ((EditTextPreference)preference).getText();
else if(preference instanceof RingtonePreference) { else if(preference instanceof RingtonePreference)
value = getPreferenceManager().getSharedPreferences().getString(preference.getKey(), null); value = getPreferenceManager().getSharedPreferences().getString(preference.getKey(), null);
}
if(value != null) if(value != null || Preference.class.equals(preference.getClass()))
updatePreferences(preference, value); updatePreferences(preference, value);
preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@ -72,4 +75,9 @@ abstract public class TodorooPreferences extends PreferenceActivity {
} }
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
initializePreference(getPreferenceScreen());
}
} }

@ -44,8 +44,8 @@ public final class CoreFilterExposer extends BroadcastReceiver {
searchFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_search)).getBitmap(); searchFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_search)).getBitmap();
// extended // extended
FilterCategory extended = new FilterCategory(CorePlugin.IDENTIFIER, FilterCategory extended = new FilterCategory(r.getString(R.string.BFE_Extended),
r.getString(R.string.BFE_Extended), new Filter[5]); new Filter[5]);
Filter alphabetical = new Filter(r.getString(R.string.BFE_Alphabetical), Filter alphabetical = new Filter(r.getString(R.string.BFE_Alphabetical),
r.getString(R.string.BFE_Alphabetical), r.getString(R.string.BFE_Alphabetical),

@ -22,7 +22,7 @@ import com.todoroo.astrid.rmilk.data.MilkDataService;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
public class DetailExposer extends BroadcastReceiver { public class MilkDetailExposer extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@ -38,27 +38,24 @@ public class DetailExposer extends BroadcastReceiver {
if(metadata == null) if(metadata == null)
return; return;
TaskDetail[] details = new TaskDetail[2]; Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, Utilities.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
long listId = metadata.getValue(MilkDataService.LIST_ID); long listId = metadata.getValue(MilkDataService.LIST_ID);
if(listId > 0) if(listId > 0) {
details[0] = new TaskDetail(context.getString(R.string.rmilk_TLA_list, TaskDetail detail = new TaskDetail(context.getString(R.string.rmilk_TLA_list,
MilkDataService.getInstance().getListName(listId))); MilkDataService.getInstance().getListName(listId)));
else broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, detail);
details[0] = null; context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
int repeat = metadata.getValue(MilkDataService.REPEATING); int repeat = metadata.getValue(MilkDataService.REPEATING);
if(repeat != 0) if(repeat != 0) {
details[1] = new TaskDetail(context.getString(R.string.rmilk_TLA_repeat)); TaskDetail detail = new TaskDetail(context.getString(R.string.rmilk_TLA_repeat));
else broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, detail);
details[1] = null; context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
// transmit
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, Utilities.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, details);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
} }
} }

@ -25,7 +25,7 @@ import com.todoroo.astrid.rmilk.data.MilkDataService;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
public class FilterExposer extends BroadcastReceiver { public class MilkFilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls") @SuppressWarnings("nls")
private Filter filterFromList(Context context, ListContainer list) { private Filter filterFromList(Context context, ListContainer list) {
@ -57,10 +57,9 @@ public class FilterExposer extends BroadcastReceiver {
for(int i = 0; i < lists.length; i++) for(int i = 0; i < lists.length; i++)
listFilters[i] = filterFromList(context, lists[i]); listFilters[i] = filterFromList(context, lists[i]);
FilterListHeader rtmHeader = new FilterListHeader(Utilities.IDENTIFIER, FilterListHeader rtmHeader = new FilterListHeader(context.getString(R.string.rmilk_FEx_header));
context.getString(R.string.rmilk_FEx_header)); FilterCategory rtmLists = new FilterCategory(context.getString(R.string.rmilk_FEx_list),
FilterCategory rtmLists = new FilterCategory(Utilities.IDENTIFIER, listFilters);
context.getString(R.string.rmilk_FEx_list), listFilters);
// transmit filter list // transmit filter list
FilterListItem[] list = new FilterListItem[2]; FilterListItem[] list = new FilterListItem[2];

@ -1,23 +1,23 @@
package com.todoroo.astrid.rmilk; package com.todoroo.astrid.rmilk;
import java.util.Date;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.view.View; import android.view.View;
import android.view.ViewGroup.OnHierarchyChangeListener; import android.view.ViewGroup.OnHierarchyChangeListener;
import android.widget.ListView; import android.widget.ListView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.widget.TodorooPreferences;
import com.todoroo.astrid.rmilk.sync.RTMSyncProvider; import com.todoroo.astrid.rmilk.sync.RTMSyncProvider;
/** /**
@ -27,106 +27,139 @@ import com.todoroo.astrid.rmilk.sync.RTMSyncProvider;
* @author timsu * @author timsu
* *
*/ */
public class MilkPreferences extends PreferenceActivity { public class MilkPreferences extends TodorooPreferences {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_rmilk);
PreferenceScreen screen = getPreferenceScreen();
initializePreference(screen);
// status
boolean loggedIn = Utilities.isLoggedIn();
final String status = "Please Log In To RTM!"; //$NON-NLS-1$
final int statusColor = Color.RED;
Resources r = getResources();
Preference preference = screen.findPreference(r.getString(R.string.rmilk_MPr_status_key));
preference.setTitle(status);
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(statusColor);
}
}
});
// action buttons
Preference syncAction = screen.getPreferenceManager().findPreference(
getString(R.string.rmilk_MPr_sync_key));
syncAction.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
new RTMSyncProvider().synchronize();
return true;
}
});
Preference clearDataPreference = screen.getPreferenceManager().findPreference(
getString(R.string.rmilk_MPr_forget_key));
if(!loggedIn) {
syncAction.setTitle(R.string.rmilk_MPr_sync_log_in);
clearDataPreference.setEnabled(false);
}
}
private void initializePreference(Preference preference) { @Autowired
if(preference instanceof PreferenceGroup) { DialogUtilities dialogUtilities;
PreferenceGroup group = (PreferenceGroup)preference;
for(int i = 0; i < group.getPreferenceCount(); i++) {
initializePreference(group.getPreference(i));
}
} else {
Object value = null;
if(preference instanceof ListPreference)
value = ((ListPreference)preference).getValue();
else if(preference instanceof CheckBoxPreference)
value = ((CheckBoxPreference)preference).isChecked();
else if(preference instanceof EditTextPreference)
value = ((EditTextPreference)preference).getText();
else
return;
updatePreferences(preference, value);
preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override
public boolean onPreferenceChange(Preference myPreference, Object newValue) { public int getPreferenceResource() {
return updatePreferences(myPreference, newValue); return R.xml.preferences_rmilk;
}
});
}
} }
/** /**
* *
* @param resource if null, updates all resources * @param resource
* if null, updates all resources
*/ */
protected boolean updatePreferences(Preference preference, Object value) { @Override
Resources r = getResources(); public void updatePreferences(Preference preference, Object value) {
final Resources r = getResources();
// interval // interval
if(r.getString(R.string.rmilk_MPr_interval_key).equals(preference.getKey())) { if (r.getString(R.string.rmilk_MPr_interval_key).equals(
int index = AndroidUtilities.indexOf(r.getStringArray(R.array.rmilk_MPr_interval_values), (String)value); preference.getKey())) {
if(index <= 0) int index = AndroidUtilities.indexOf(
r.getStringArray(R.array.rmilk_MPr_interval_values),
(String) value);
if (index <= 0)
preference.setSummary(R.string.rmilk_MPr_interval_desc_disabled); preference.setSummary(R.string.rmilk_MPr_interval_desc_disabled);
else else
preference.setSummary(r.getString(R.string.rmilk_MPr_interval_desc, preference.setSummary(r.getString(
R.string.rmilk_MPr_interval_desc,
r.getStringArray(R.array.rmilk_MPr_interval_entries)[index])); r.getStringArray(R.array.rmilk_MPr_interval_entries)[index]));
} }
// shortcut // shortcut
else if(r.getString(R.string.rmilk_MPr_shortcut_key).equals(preference.getKey())) { else if (r.getString(R.string.rmilk_MPr_shortcut_key).equals(
if((Boolean)value) { preference.getKey())) {
if ((Boolean) value) {
preference.setSummary(R.string.rmilk_MPr_shortcut_desc_enabled); preference.setSummary(R.string.rmilk_MPr_shortcut_desc_enabled);
} else { } else {
preference.setSummary(R.string.rmilk_MPr_shortcut_desc_disabled); preference.setSummary(R.string.rmilk_MPr_shortcut_desc_disabled);
} }
} }
return true; // status
else if (r.getString(R.string.rmilk_MPr_status_key).equals(preference.getKey())) {
boolean loggedIn = Utilities.isLoggedIn();
String status;
String subtitle = ""; //$NON-NLS-1$
int statusColor;
// ! logged in - display message, click -> sync
if(!loggedIn) {
status = r.getString(R.string.rmilk_status_loggedout);
statusColor = Color.RED;
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
new RTMSyncProvider().synchronize(MilkPreferences.this);
return true;
}
});
}
// last sync was error
else if(Utilities.getLastAttemptedSyncDate() != 0) {
status = r.getString(R.string.rmilk_status_failed,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(Utilities.getLastAttemptedSyncDate())));
if(Utilities.getLastSyncDate() > 0) {
subtitle = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(Utilities.getLastSyncDate())));
}
statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
String error = Utilities.getLastError();
if(error != null)
dialogUtilities.okDialog(MilkPreferences.this, error, null);
return true;
}
});
} else {
status = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(Utilities.getLastSyncDate())));
statusColor = Color.rgb(0, 100, 0);
}
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);
}
}
});
}
// sync button
else if (r.getString(R.string.rmilk_MPr_sync_key).equals(preference.getKey())) {
boolean loggedIn = Utilities.isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
new RTMSyncProvider().synchronize(MilkPreferences.this);
return true;
}
});
if(!loggedIn)
preference.setTitle(R.string.rmilk_MPr_sync_log_in);
}
// log out button
else if (r.getString(R.string.rmilk_MPr_forget_key).equals(preference.getKey())) {
boolean loggedIn = Utilities.isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
dialogUtilities.okCancelDialog(MilkPreferences.this,
r.getString(R.string.rmilk_forget_confirm), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
new RTMSyncProvider().signOut();
initializePreference(getPreferenceScreen());
}
}, null);
return true;
}
});
if(!loggedIn)
preference.setEnabled(false);
}
} }
} }

@ -9,6 +9,7 @@ import android.preference.PreferenceManager;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.rmilk.data.MilkList; import com.todoroo.astrid.rmilk.data.MilkList;
/** /**
@ -59,6 +60,10 @@ public class Utilities {
private static final String PREF_LAST_SYNC = "rmilk_last_sync"; private static final String PREF_LAST_SYNC = "rmilk_last_sync";
private static final String PREF_LAST_ATTEMPTED_SYNC = "rmilk_last_attempted";
private static final String PREF_LAST_ERROR = "rmilk_last_error";
// --- Preference Utility Methods // --- Preference Utility Methods
/** Get preferences object from the context */ /** Get preferences object from the context */
@ -85,15 +90,48 @@ public class Utilities {
editor.commit(); editor.commit();
} }
/** RTM Last Successful Sync Date, or 0 */ /** @return RTM Last Successful Sync Date, or 0 */
public static long getLastSyncDate() { public static long getLastSyncDate() {
return getPrefs().getLong(PREF_LAST_SYNC, 0); return getPrefs().getLong(PREF_LAST_SYNC, 0);
} }
/** @return RTM Last Attempted Sync Date, or 0 if it was successful */
public static long getLastAttemptedSyncDate() {
return getPrefs().getLong(PREF_LAST_ATTEMPTED_SYNC, 0);
}
/** @return RTM Last Error, or null if no last error */
public static String getLastError() {
return getPrefs().getString(PREF_LAST_ERROR, null);
}
/** Deletes RTM Last Successful Sync Date */
public static void clearLastSyncDate() {
Editor editor = getPrefs().edit();
editor.remove(PREF_LAST_SYNC);
editor.commit();
}
/** Set RTM Last Successful Sync Date */ /** Set RTM Last Successful Sync Date */
public static void setLastSyncDate(long time) { public static void setLastError(String error) {
Editor editor = getPrefs().edit();
editor.putString(PREF_LAST_ERROR, error);
editor.commit();
}
/** Set RTM Last Successful Sync Date */
public static void recordSuccessfulSync() {
Editor editor = getPrefs().edit();
editor.putLong(PREF_LAST_SYNC, DateUtilities.now());
editor.putLong(PREF_LAST_ATTEMPTED_SYNC, 0);
editor.commit();
}
/** Set RTM Last Attempted Sync Date */
public static void recordSyncStart() {
Editor editor = getPrefs().edit(); Editor editor = getPrefs().edit();
editor.putLong(PREF_LAST_SYNC, time); editor.putLong(PREF_LAST_ATTEMPTED_SYNC, DateUtilities.now());
editor.putString(PREF_LAST_ERROR, null);
editor.commit(); editor.commit();
} }

@ -109,8 +109,10 @@ public final class MilkDataService {
*/ */
public TodorooCursor<Task> getLocallyCreated(Property<?>[] properties) { public TodorooCursor<Task> getLocallyCreated(Property<?>[] properties) {
return return
taskDao.query(Query.select(properties).join(METADATA_JOIN).where( taskDao.query(Query.select(properties).join(METADATA_JOIN).where(Criterion.and(
Criterion.or(TASK_ID.eq(0), Metadata.TASK.isNull()))); Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).
where(Criterion.and(MetadataCriteria.withKey(METADATA_KEY), TASK_SERIES_ID.gt(0))))),
TaskCriteria.isActive())));
} }
/** /**
@ -178,7 +180,8 @@ public final class MilkDataService {
* @return null if no metadata found * @return null if no metadata found
*/ */
public Metadata getTaskMetadata(long taskId) { public Metadata getTaskMetadata(long taskId) {
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(
LIST_ID, TASK_SERIES_ID, TASK_ID, REPEATING).where(
MetadataCriteria.byTaskAndwithKey(taskId, METADATA_KEY))); MetadataCriteria.byTaskAndwithKey(taskId, METADATA_KEY)));
try { try {
if(cursor.getCount() == 0) if(cursor.getCount() == 0)

@ -7,6 +7,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
@ -18,7 +19,6 @@ import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
@ -73,7 +73,9 @@ public class RTMSyncProvider extends SynchronizationProvider {
*/ */
public void signOut() { public void signOut() {
Utilities.setToken(null); Utilities.setToken(null);
Utilities.setLastSyncDate(0); Utilities.clearLastSyncDate();
dataService = MilkDataService.getInstance();
dataService.clearMetadata(); dataService.clearMetadata();
} }
@ -95,6 +97,9 @@ public class RTMSyncProvider extends SynchronizationProvider {
*/ */
private void handleRtmException(Context context, String tag, Exception e, private void handleRtmException(Context context, String tag, Exception e,
boolean showErrorIfNeeded) { boolean showErrorIfNeeded) {
Utilities.setLastError(e.getMessage());
// occurs when application was closed // occurs when application was closed
if(e instanceof IllegalStateException) { if(e instanceof IllegalStateException) {
exceptionService.reportError(tag + "-caught", e); //$NON-NLS-1$ exceptionService.reportError(tag + "-caught", e); //$NON-NLS-1$
@ -119,8 +124,7 @@ public class RTMSyncProvider extends SynchronizationProvider {
} }
@Override @Override
protected void initiate() { protected void initiate(Context context) {
Context context = ContextManager.getContext();
dataService = MilkDataService.getInstance(); dataService = MilkDataService.getInstance();
// authenticate the user. this will automatically call the next step // authenticate the user. this will automatically call the next step
@ -137,6 +141,8 @@ public class RTMSyncProvider extends SynchronizationProvider {
final Resources r = context.getResources(); final Resources r = context.getResources();
FlurryAgent.onEvent("rtm-started"); FlurryAgent.onEvent("rtm-started");
Utilities.recordSyncStart();
try { try {
String appName = null; String appName = null;
String authToken = Utilities.getToken(); String authToken = Utilities.getToken();
@ -180,7 +186,7 @@ public class RTMSyncProvider extends SynchronizationProvider {
try { try {
String token = rtmService.completeAuthorization(); String token = rtmService.completeAuthorization();
Utilities.setToken(token); Utilities.setToken(token);
// TODO proceed with sync synchronize(context);
return null; return null;
} catch (Exception e) { } catch (Exception e) {
// didn't work // didn't work
@ -193,7 +199,10 @@ public class RTMSyncProvider extends SynchronizationProvider {
} }
}); });
intent.putExtra(MilkLoginActivity.URL_TOKEN, url); intent.putExtra(MilkLoginActivity.URL_TOKEN, url);
context.startActivity(intent); if(context instanceof Activity)
((Activity)context).startActivityForResult(intent, 0);
else
context.startActivity(intent);
} else { } else {
performSync(context); performSync(context);
@ -256,7 +265,7 @@ public class RTMSyncProvider extends SynchronizationProvider {
SyncData syncData = populateSyncData(remoteChanges); SyncData syncData = populateSyncData(remoteChanges);
synchronizeTasks(syncData); synchronizeTasks(syncData);
Utilities.setLastSyncDate(DateUtilities.now()); Utilities.recordSuccessfulSync();
FlurryAgent.onEvent("rtm-sync-finished"); //$NON-NLS-1$ FlurryAgent.onEvent("rtm-sync-finished"); //$NON-NLS-1$
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
@ -381,7 +390,6 @@ public class RTMSyncProvider extends SynchronizationProvider {
// TODO tags, notes, url, ... // TODO tags, notes, url, ...
if(remoteTask != null && shouldTransmit(task, MilkDataService.LIST_ID, remoteTask) && if(remoteTask != null && shouldTransmit(task, MilkDataService.LIST_ID, remoteTask) &&
task.getValue(MilkDataService.LIST_ID) != 0) task.getValue(MilkDataService.LIST_ID) != 0)
rtmService.tasks_moveTo(timeline, Long.toString(remoteTask.getValue(MilkDataService.LIST_ID)), rtmService.tasks_moveTo(timeline, Long.toString(remoteTask.getValue(MilkDataService.LIST_ID)),

@ -76,18 +76,17 @@ public class TagFilterExposer extends BroadcastReceiver {
for(int i = 0; i < tagsBySize.length; i++) for(int i = 0; i < tagsBySize.length; i++)
filtersBySize[i] = filterFromTag(context, tagsBySize[i]); filtersBySize[i] = filterFromTag(context, tagsBySize[i]);
FilterListHeader tagsHeader = new FilterListHeader(TagsPlugin.IDENTIFIER, FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header));
context.getString(R.string.tag_FEx_header));
Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged), Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged),
r.getString(R.string.tag_FEx_untagged), r.getString(R.string.tag_FEx_untagged),
tagService.untaggedTemplate(), tagService.untaggedTemplate(),
null); null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap(); untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap();
FilterCategory tagsCategoryBySize = new FilterCategory(TagsPlugin.IDENTIFIER, FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size),
context.getString(R.string.tag_FEx_by_size), filtersBySize); filtersBySize);
tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap(); tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap();
FilterCategory tagsCategoryByAlpha = new FilterCategory(TagsPlugin.IDENTIFIER, FilterCategory tagsCategoryByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha),
context.getString(R.string.tag_FEx_alpha), filtersByAlpha); filtersByAlpha);
tagsCategoryByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap(); tagsCategoryByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap();
// transmit filter list // transmit filter list

@ -51,6 +51,13 @@
<string name="rmilk_MPr_group_status">Status</string> <string name="rmilk_MPr_group_status">Status</string>
<!-- Preference Key (do not translate) --> <!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_status_key">rmilk_status</string> <string name="rmilk_MPr_status_key">rmilk_status</string>
<!-- Status: log in -->
<string name="rmilk_status_loggedout">Please Log In To RTM!</string>
<!-- Status: success (%s -> last sync date) -->
<string name="rmilk_status_success">Last Sync: %s</string>
<!-- Status: error (%s -> last attempted sync date) -->
<string name="rmilk_status_failed">Sync Failed On: %s</string>
<!-- Options Group Label --> <!-- Options Group Label -->
<string name="rmilk_MPr_group_options">Options</string> <string name="rmilk_MPr_group_options">Options</string>

Loading…
Cancel
Save