iOS style automatic sync of lists view, all tasks view, and specific lists when opened

pull/14/head
Sam Bosley 14 years ago
parent 0035f27794
commit a7fabed823

@ -9,9 +9,12 @@ import org.json.JSONException;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.ExpandableListActivity; import android.app.ExpandableListActivity;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException; import android.app.PendingIntent.CanceledException;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.app.SearchManager; import android.app.SearchManager;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@ -43,10 +46,14 @@ import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
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.service.NotificationManager;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
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.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.ActFmPreferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.actfm.sync.ActFmSyncService;
import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.adapter.FilterAdapter;
@ -61,6 +68,7 @@ import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.utility.Constants;
/** /**
* Activity that displays a user's task lists and allows users * Activity that displays a user's task lists and allows users
@ -80,6 +88,8 @@ public class FilterListActivity extends ExpandableListActivity {
private static final int MENU_HELP_ID = Menu.FIRST + 1; private static final int MENU_HELP_ID = Menu.FIRST + 1;
private static final int MENU_REFRESH_ID = Menu.FIRST + 2; private static final int MENU_REFRESH_ID = Menu.FIRST + 2;
private static final String LAST_TAG_REFRESH_KEY = "last_tag_refresh"; //$NON-NLS-1$
private static final int CONTEXT_MENU_SHORTCUT = Menu.FIRST + 3; private static final int CONTEXT_MENU_SHORTCUT = Menu.FIRST + 3;
private static final int CONTEXT_MENU_INTENT = Menu.FIRST + 4; private static final int CONTEXT_MENU_INTENT = Menu.FIRST + 4;
@ -155,6 +165,8 @@ public class FilterListActivity extends ExpandableListActivity {
startActivity(intent); startActivity(intent);
} else { } else {
setUpList(); setUpList();
if (actFmPreferenceService.isLoggedIn())
onRefreshRequested(false);
} }
} }
@ -380,7 +392,7 @@ public class FilterListActivity extends ExpandableListActivity {
} }
case MENU_REFRESH_ID: { case MENU_REFRESH_ID: {
onRefreshRequested(); onRefreshRequested(true);
return true; return true;
} }
@ -415,8 +427,26 @@ public class FilterListActivity extends ExpandableListActivity {
/** /**
* Refresh user tags * Refresh user tags
*/ */
private void onRefreshRequested() { private void onRefreshRequested(final boolean manual) {
final ProgressDialog progressDialog = DialogUtilities.progressDialog(this, getString(R.string.DLG_please_wait)); if (!manual) {
long lastFetchDate = Preferences.getLong(LAST_TAG_REFRESH_KEY, 0);
if(DateUtilities.now() < lastFetchDate + 300000L) {
return;
}
}
final ProgressDialog progressDialog;
final NotificationManager nm = new NotificationManager.AndroidNotificationManager(this);
final Notification notification = new Notification(android.R.drawable.stat_notify_sync, null, System.currentTimeMillis());
final int notificationId = updateNotification(this, notification);
notification.flags |= Notification.FLAG_ONGOING_EVENT;
if (manual) {
progressDialog = DialogUtilities.progressDialog(this, getString(R.string.DLG_please_wait));
} else {
progressDialog = null;
nm.notify(notificationId, notification);
}
new Thread(new Runnable() { new Thread(new Runnable() {
@SuppressWarnings("nls") @SuppressWarnings("nls")
@ -428,6 +458,7 @@ public class FilterListActivity extends ExpandableListActivity {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Preferences.setLong(LAST_TAG_REFRESH_KEY, DateUtilities.now());
adapter.clear(); adapter.clear();
adapter.getLists(); adapter.getLists();
} }
@ -438,12 +469,26 @@ public class FilterListActivity extends ExpandableListActivity {
} catch (JSONException e) { } catch (JSONException e) {
exceptionService.displayAndReportError(FilterListActivity.this, "refresh-tags-json", e); exceptionService.displayAndReportError(FilterListActivity.this, "refresh-tags-json", e);
} finally { } finally {
if (manual)
DialogUtilities.dismissDialog(FilterListActivity.this, progressDialog); DialogUtilities.dismissDialog(FilterListActivity.this, progressDialog);
else
nm.cancel(notificationId);
} }
} }
}).start(); }).start();
} }
private int updateNotification(Context context, Notification notification) {
String notificationTitle = context.getString(R.string.actfm_notification_title);
Intent intent = new Intent(context, ActFmPreferences.class);
PendingIntent notificationIntent = PendingIntent.getActivity(context, 0,
intent, 0);
notification.setLatestEventInfo(context,
notificationTitle, context.getString(R.string.SyP_progress),
notificationIntent);
return Constants.NOTIFICATION_SYNC;
}
private void showCreateShortcutDialog(final Intent shortcutIntent, private void showCreateShortcutDialog(final Intent shortcutIntent,
final Filter filter) { final Filter filter) {
FrameLayout frameLayout = new FrameLayout(this); FrameLayout frameLayout = new FrameLayout(this);

@ -71,6 +71,8 @@ import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.andlib.widget.GestureService; import com.todoroo.andlib.widget.GestureService;
import com.todoroo.andlib.widget.GestureService.GestureInterface; import com.todoroo.andlib.widget.GestureService.GestureInterface;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncProvider;
import com.todoroo.astrid.activity.SortSelectionActivity.OnSortSelectedListener; import com.todoroo.astrid.activity.SortSelectionActivity.OnSortSelectedListener;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener; import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
@ -168,6 +170,8 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
@Autowired UpgradeService upgradeService; @Autowired UpgradeService upgradeService;
@Autowired ActFmPreferenceService actFmPreferenceService;
private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] { private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] {
new ReminderDebugContextActions.MakeNotification(), new ReminderDebugContextActions.MakeNotification(),
new ReminderDebugContextActions.WhenReminder(), new ReminderDebugContextActions.WhenReminder(),
@ -187,7 +191,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
private EditText quickAddBox; private EditText quickAddBox;
private Timer backgroundTimer; private Timer backgroundTimer;
private final LinkedHashSet<SyncAction> syncActions = new LinkedHashSet<SyncAction>(); private final LinkedHashSet<SyncAction> syncActions = new LinkedHashSet<SyncAction>();
private boolean isInbox; private boolean isFilter;
private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader(); private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader();
private VoiceInputAssistant voiceInputAssistant; private VoiceInputAssistant voiceInputAssistant;
@ -281,12 +285,12 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
return; return;
} else if(extras != null && extras.containsKey(TOKEN_FILTER)) { } else if(extras != null && extras.containsKey(TOKEN_FILTER)) {
filter = extras.getParcelable(TOKEN_FILTER); filter = extras.getParcelable(TOKEN_FILTER);
isInbox = true; isFilter = true;
} else { } else {
filter = CoreFilterExposer.buildInboxFilter(getResources()); filter = CoreFilterExposer.buildInboxFilter(getResources());
findViewById(R.id.headerLogo).setVisibility(View.VISIBLE); findViewById(R.id.headerLogo).setVisibility(View.VISIBLE);
findViewById(R.id.listLabel).setVisibility(View.GONE); findViewById(R.id.listLabel).setVisibility(View.GONE);
isInbox = false; isFilter = false;
} }
setUpTaskList(); setUpTaskList();
@ -466,6 +470,19 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
} }
private void initiateAutomaticSync() {
if (!actFmPreferenceService.isLoggedIn()) return;
long lastFetchDate = actFmPreferenceService.getLastSyncDate();
if(DateUtilities.now() < lastFetchDate + 300000L)
return;
new Thread() {
@Override
public void run() {
new ActFmSyncProvider().synchronize(TaskListActivity.this);
}
}.start();
}
// Subclasses can override these to customize extras in quickadd intent // Subclasses can override these to customize extras in quickadd intent
protected Intent getOnClickQuickAddIntent(Task t) { protected Intent getOnClickQuickAddIntent(Task t) {
Intent intent = new Intent(TaskListActivity.this, TaskEditActivity.class); Intent intent = new Intent(TaskListActivity.this, TaskEditActivity.class);
@ -536,6 +553,10 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
registerReceiver(syncActionReceiver, registerReceiver(syncActionReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_SEND_SYNC_ACTIONS)); new IntentFilter(AstridApiConstants.BROADCAST_SEND_SYNC_ACTIONS));
setUpBackgroundJobs(); setUpBackgroundJobs();
if (filter.title.equals(getString(R.string.BFE_Active))) {
initiateAutomaticSync();
}
} }
@Override @Override
@ -835,7 +856,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
* @param item task that was completed * @param item task that was completed
*/ */
protected void onTaskCompleted(Task item) { protected void onTaskCompleted(Task item) {
if(isInbox) if(isFilter)
StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_INBOX); StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_INBOX);
else else
StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_FILTER); StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_FILTER);

@ -80,7 +80,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
private final DisplayMetrics metrics = new DisplayMetrics(); private final DisplayMetrics metrics = new DisplayMetrics();
/** receiver for new filters */ /** receiver for new filters */
private final FilterReceiver filterReceiver = new FilterReceiver(); //private final FilterReceiver filterReceiver = new FilterReceiver();
private final BladeFilterReceiver bladeFilterReceiver = new BladeFilterReceiver(); private final BladeFilterReceiver bladeFilterReceiver = new BladeFilterReceiver();
/** row layout to inflate */ /** row layout to inflate */
@ -448,8 +448,8 @@ public class FilterAdapter extends BaseExpandableListAdapter {
* Call this method from your activity's onResume() method * Call this method from your activity's onResume() method
*/ */
public void registerRecevier() { public void registerRecevier() {
activity.registerReceiver(filterReceiver, /*activity.registerReceiver(filterReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS)); new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS));//*/
activity.registerReceiver(bladeFilterReceiver, activity.registerReceiver(bladeFilterReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS)); new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS));
if(getGroupCount() == 0) if(getGroupCount() == 0)
@ -460,7 +460,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
* Call this method from your activity's onResume() method * Call this method from your activity's onResume() method
*/ */
public void unregisterRecevier() { public void unregisterRecevier() {
activity.unregisterReceiver(filterReceiver); //activity.unregisterReceiver(filterReceiver);
activity.unregisterReceiver(bladeFilterReceiver); activity.unregisterReceiver(bladeFilterReceiver);
} }

Loading…
Cancel
Save