private synchronized void pushUpdated(GtasksInvoker invoker, SyncResultCallback callback) { TodorooCursor<Task> queued = taskService.query( Query.select(Task.PROPERTIES) .join( Join.left( Metadata.TABLE, Criterion.and( MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), Task.ID.eq(Metadata.TASK)))) .where( Criterion.or( Task.MODIFICATION_DATE.gt(GtasksMetadata.LAST_SYNC), Criterion.and( Task.USER_ID.neq(Task.USER_ID_SELF), GtasksMetadata.ID.isNotNull()), Metadata.KEY.isNull()))); callback.incrementMax(queued.getCount() * 10); try { Task task = new Task(); for (queued.moveToFirst(); !queued.isAfterLast(); queued.moveToNext()) { task.readFromCursor(queued); try { gtasksSyncService.pushTaskOnSave(task, task.getMergedValues(), invoker, false); } catch (GoogleTasksException e) { handler.handleException("gtasks-sync-io", e, e.getType()); // $NON-NLS-1$ } catch (IOException e) { handler.handleException("gtasks-sync-io", e, e.toString()); // $NON-NLS-1$ } finally { callback.incrementProgress(10); } } } finally { queued.close(); } }
/** * Cursor with the following columns * * <ol> * <li>task title, string * <li>task importance color, int android RGB color * <li>task due date (was: preferred due date), long millis since epoch * <li>task due date (was: absolute due date), long millis since epoch * <li>task importance, integer from 0 to 3 (0 => most important) * <li>task id, long * <li>task tags, string tags separated by | * </ol> * * @return cursor as described above */ public Cursor getTasks() { MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); TodorooCursor<Task> cursor = taskService.query( Query.select(Task.ID, Task.TITLE, Task.IMPORTANCE, Task.DUE_DATE) .where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible())) .orderBy(SortHelper.defaultTaskOrder()) .limit(MAX_NUMBER_OF_TASKS)); try { int[] importanceColors = Task.getImportanceColors(ctx.getResources()); Task task = new Task(); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToNext(); task.readFromCursor(cursor); StringBuilder taskTags = new StringBuilder(); TodorooCursor<Metadata> tagCursor = TagService.getInstance().getTags(task.getId()); try { for (tagCursor.moveToFirst(); !tagCursor.isAfterLast(); tagCursor.moveToNext()) taskTags.append(tagCursor.get(TagService.TAG)).append(TAG_SEPARATOR); } finally { tagCursor.close(); } Object[] values = new Object[7]; values[0] = task.getValue(Task.TITLE); values[1] = importanceColors[task.getValue(Task.IMPORTANCE)]; values[2] = task.getValue(Task.DUE_DATE); values[3] = task.getValue(Task.DUE_DATE); values[4] = task.getValue(Task.IMPORTANCE); values[5] = task.getId(); values[6] = taskTags.toString(); ret.addRow(values); } } finally { cursor.close(); } return ret; }
private void serializeTasks() throws IOException { TodorooCursor<Task> cursor; cursor = taskService.query(Query.select(Task.PROPERTIES).orderBy(Order.asc(Task.ID))); try { int length = cursor.getCount(); for (int i = 0; i < length; i++) { cursor.moveToNext(); Task task = new Task(cursor); setProgress(i, length); xml.startTag(null, BackupConstants.TASK_TAG); serializeModel(task, Task.PROPERTIES, Task.ID); serializeMetadata(task); xml.endTag(null, BackupConstants.TASK_TAG); this.exportCount++; } } finally { cursor.close(); } }
private void titleMatchWithActFm(Task task) { String title = task.getValue(Task.TITLE); TodorooCursor<Task> match = taskService.query( Query.select(Task.ID) .join( Join.left( Metadata.TABLE, Criterion.and( Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), Metadata.TASK.eq(Task.ID)))) .where(Criterion.and(Task.TITLE.eq(title), GtasksMetadata.ID.isNull()))); try { if (match.getCount() > 0) { match.moveToFirst(); task.setId(match.get(Task.ID)); } } finally { match.close(); } }
public void checkAndMigrateLegacy() throws IOException { if (!gtasksPreferenceService.migrationHasOccurred()) { // Fetch all tasks that have associated gtask metadata String defaultListTitle = gtasksListService.getListName( Preferences.getStringValue(GtasksPreferenceService.PREF_DEFAULT_LIST)); String defaultListId = null; TodorooCursor<Task> allTasksWithGtaskData = taskService.query( Query.select(Task.PROPERTIES) .where( Task.ID.in( Query.select(Metadata.TASK) .from(Metadata.TABLE) .where(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY))))); try { if (allTasksWithGtaskData.getCount() > 0) { // Fetch all remote tasks from all remote lists (this may be an expensive operation) // and map their titles to their real remote ids HashMap<String, String> taskAndListTitlesToRemoteTaskIds = new HashMap<String, String>(); List<TaskList> items = allLists.getItems(); for (TaskList list : items) { if (list.getTitle().equals(defaultListTitle)) { defaultListId = list.getId(); } Tasks allTasks = gtasksService.getAllGtasksFromListId(list.getId(), false, false, 0); List<com.google.api.services.tasks.model.Task> tasksItems = allTasks.getItems(); if (tasksItems != null) { for (com.google.api.services.tasks.model.Task t : tasksItems) { String key = constructKeyFromTitles(t.getTitle(), list.getTitle()); taskAndListTitlesToRemoteTaskIds.put(key, t.getId()); } } } if (defaultListId == null) { com.google.api.services.tasks.model.TaskList defaultList = gtasksService.getGtaskList("@default"); // $NON-NLS-1$ defaultListId = defaultList.getId(); } Preferences.setString(GtasksPreferenceService.PREF_DEFAULT_LIST, defaultListId); // For each local task, check to see if its title paired with any list title has a match // in the map for (allTasksWithGtaskData.moveToFirst(); !allTasksWithGtaskData.isAfterLast(); allTasksWithGtaskData.moveToNext()) { GtasksTaskContainer container = gtasksMetadataService.readTaskAndMetadata(allTasksWithGtaskData); // memorize the original listname for the case that the task is not matched, // then it should at least be recreated in the correct list String originalListName = gtasksListService.getListName( container.gtaskMetadata.getValue(GtasksMetadata.LIST_ID)); String originalListId = null; // Search through lists to see if one of them has match String taskTitle = container.task.getValue(Task.TITLE); boolean foundMatch = false; items = allLists.getItems(); for (TaskList list : items) { String expectedKey = constructKeyFromTitles(taskTitle, list.getTitle()); // save the new id of the current list // if it matches the listname of the current task if (list.getTitle() != null && list.getTitle().equals(originalListName)) { originalListId = list.getId(); } if (taskAndListTitlesToRemoteTaskIds.containsKey(expectedKey)) { foundMatch = true; String newRemoteTaskId = taskAndListTitlesToRemoteTaskIds.get(expectedKey); String newRemoteListId = list.getId(); container.gtaskMetadata.setValue(GtasksMetadata.ID, newRemoteTaskId); container.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, newRemoteListId); gtasksMetadataService.saveTaskAndMetadata(container); break; } } if (!foundMatch) { // For non-matches, make the task look newly created container.gtaskMetadata = GtasksMetadata.createEmptyMetadata(container.task.getId()); container.gtaskMetadata.setValue(GtasksMetadata.ID, ""); // $NON-NLS-1$ if (originalListId != null) { // set the list-id based on the original listname, saved above during for-loop container.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, originalListId); } else { // remote list or local list was renamed, so put this unmatched task in the default // list container.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, defaultListId); } gtasksMetadataService.saveTaskAndMetadata(container); break; } } } // migrate the list-id's afterwards, so that we can put the non-matched tasks in their // original lists // if the listnames didnt change before migration (defaultlist otherwise) listService.migrateListIds(allLists); } finally { allTasksWithGtaskData.close(); } Preferences.setBoolean( GtasksPreferenceService.PREF_MIGRATION_HAS_OCCURRED, true); // Record successful migration } }
@Override public void onReceive(Context context, Intent intent) { if (!Preferences.getBoolean(R.string.p_rmd_enabled, true)) return; DependencyInjectionService.getInstance().inject(this); int reengagementReminders = Preferences.getInt(ReengagementService.PREF_REENGAGEMENT_COUNT, 1); Preferences.setInt(ReengagementService.PREF_REENGAGEMENT_COUNT, reengagementReminders + 1); Intent notifIntent = new Intent(context, TaskListActivity.class); QueryTemplate template = new QueryTemplate().where(TaskCriteria.activeVisibleMine()); String sql = SortHelper.adjustQueryForFlagsAndSort(template.toString(), 0, SortHelper.SORT_AUTO) + " LIMIT " + TASK_LIMIT; //$NON-NLS-1$ boolean hasTasks = false; TodorooCursor<Task> tasks = taskService.query( Query.select(Task.ID).where(TaskCriteria.activeVisibleMine()).limit(TASK_LIMIT)); try { hasTasks = tasks.getCount() > 0; } finally { tasks.close(); } String title = Notifications.getRandomReminder( context.getResources().getStringArray(R.array.rmd_reengage_notif_titles)); if (title.contains("%s")) { // $NON-NLS-1$ String name = ""; // $NON-NLS-1$ if (actFmPreferenceService.isLoggedIn()) { JSONObject thisUser = ActFmPreferenceService.thisUser(); name = thisUser.optString("first_name"); // $NON-NLS-1$ if (TextUtils.isEmpty(name)) name = thisUser.optString("name"); // $NON-NLS-1$ if (TextUtils.isEmpty(name)) name = context.getString(R.string.rmd_reengage_name_default); } title = String.format(title, name); } String text = Notifications.getRandomReminder( context .getResources() .getStringArray( hasTasks ? R.array.rmd_reengage_dialog_options : R.array.rmd_reengage_dialog_empty_options)); FilterWithCustomIntent filter = new FilterWithCustomIntent( context.getString(R.string.rmd_NoA_filter), context.getString(R.string.rmd_NoA_filter), sql, null); filter.customTaskList = new ComponentName(context, ReengagementFragment.class); filter.customExtras = new Bundle(); filter.customExtras.putString(ReengagementFragment.EXTRA_TEXT, text); notifIntent.setAction("NOTIFY_reengagement"); // $NON-NLS-1$ notifIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter); notifIntent.putExtra(ReengagementFragment.EXTRA_TEXT, text); notifIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_REENGAGEMENT); NotificationManager manager = new AndroidNotificationManager(context); Notification notification = new Notification(R.drawable.notif_astrid, text, System.currentTimeMillis()); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); notification.setLatestEventInfo(context, title, text, pendingIntent); notification.flags |= Notification.FLAG_AUTO_CANCEL; if (Preferences.getBoolean(R.string.p_rmd_persistent, true)) { notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_SHOW_LIGHTS; notification.ledOffMS = 5000; notification.ledOnMS = 700; notification.ledARGB = Color.YELLOW; } else { notification.defaults = Notification.DEFAULT_LIGHTS; } manager.notify(0, notification); Flags.set(Flags.REFRESH); // Forces a reload when app launches ReengagementService.scheduleReengagementAlarm(context); }