@SuppressWarnings("nls") private TodorooCursor<Task> constructCursor() { String tagName = null; if (getActiveTagData() != null) tagName = getActiveTagData().getValue(TagData.NAME); String[] emergentTags = TagService.getInstance().getEmergentTags(); StringProperty tagProperty = new StringProperty(null, TAGS_METADATA_JOIN + "." + TagService.TAG.name); Criterion tagsJoinCriterion = Criterion.and( Field.field(TAGS_METADATA_JOIN + "." + Metadata.KEY.name) .eq(TagService.KEY), // $NON-NLS-1$ Task.ID.eq(Field.field(TAGS_METADATA_JOIN + "." + Metadata.TASK.name)), Criterion.not(tagProperty.in(emergentTags))); if (tagName != null) tagsJoinCriterion = Criterion.and( tagsJoinCriterion, Field.field(TAGS_METADATA_JOIN + "." + TagService.TAG.name).neq(tagName)); // TODO: For now, we'll modify the query to join and include the task rabbit and tag data here. // Eventually, we might consider restructuring things so that this query is constructed // elsewhere. String joinedQuery = Join.left( Metadata.TABLE.as(TR_METADATA_JOIN), Criterion.and( Field.field(TR_METADATA_JOIN + "." + Metadata.KEY.name) .eq(TaskRabbitMetadata.METADATA_KEY), // $NON-NLS-1$ Task.ID.eq(Field.field(TR_METADATA_JOIN + "." + Metadata.TASK.name)))) .toString() //$NON-NLS-1$ + Join.left(Metadata.TABLE.as(TAGS_METADATA_JOIN), tagsJoinCriterion) .toString() //$NON-NLS-1$ + filter.getSqlQuery(); sqlQueryTemplate.set(SortHelper.adjustQueryForFlagsAndSort(joinedQuery, sortFlags, sortSort)); String groupedQuery; if (sqlQueryTemplate.get().contains("GROUP BY")) groupedQuery = sqlQueryTemplate.get(); else if (sqlQueryTemplate.get().contains("ORDER BY")) // $NON-NLS-1$ groupedQuery = sqlQueryTemplate .get() .replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); // $NON-NLS-1$ else groupedQuery = sqlQueryTemplate.get() + " GROUP BY " + Task.ID; sqlQueryTemplate.set(groupedQuery); // Peform query try { return taskService.fetchFiltered(sqlQueryTemplate.get(), null, taskProperties()); } catch (SQLiteException e) { // We don't show this error anymore--seems like this can get triggered // by a strange bug, but there seems to not be any negative side effect. // For now, we'll suppress the error // See http://astrid.com/home#tags-7tsoi/task-1119pk return null; } }
/** * Build inbox filter * * @return */ public static Filter buildInboxFilter(Resources r) { Filter inbox = new Filter( r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active), new QueryTemplate() .where( Criterion.and( TaskCriteria.activeVisibleMine(), Criterion.not( Task.ID.in( Query.select(Metadata.TASK) .from(Metadata.TABLE) .where( Criterion.and( MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_NAME.like( "x_%", "x"))))))), // $NON-NLS-1$ //$NON-NLS-2$ null); int themeFlags = ThemeService.getFilterThemeFlags(); inbox.listingIcon = ((BitmapDrawable) r.getDrawable(ThemeService.getDrawable(R.drawable.filter_inbox, themeFlags))) .getBitmap(); return inbox; }
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(); } }
public static Filter getAssignedByMeFilter(Resources r) { int themeFlags = ThemeService.getFilterThemeFlags(); Filter f = new Filter( r.getString(R.string.BFE_Assigned), r.getString(R.string.BFE_Assigned), new QueryTemplate() .join( Join.left( Metadata.TABLE, Criterion.and( Metadata.KEY.eq(TaskRabbitMetadata.METADATA_KEY), Task.ID.eq(Metadata.TASK)))) .where( Criterion.and( TaskCriteria.isActive(), Criterion.or( Task.CREATOR_ID.eq(0), Task.CREATOR_ID.eq(ActFmPreferenceService.userId())), Criterion.or(Task.USER_ID.neq(0), TaskRabbitMetadata.ID.gt(0)))), null); f.listingIcon = ((BitmapDrawable) r.getDrawable(ThemeService.getDrawable(R.drawable.filter_assigned, themeFlags))) .getBitmap(); return f; }
private synchronized void synchronizeListHelper( StoreObject list, GtasksInvoker invoker, boolean manual, SyncExceptionHandler errorHandler, SyncResultCallback callback) { String listId = list.getValue(GtasksList.REMOTE_ID); long lastSyncDate; if (!manual && list.containsNonNullValue(GtasksList.LAST_SYNC)) { lastSyncDate = list.getValue(GtasksList.LAST_SYNC); } else { lastSyncDate = 0; } boolean includeDeletedAndHidden = lastSyncDate != 0; try { Tasks taskList = invoker.getAllGtasksFromListId( listId, includeDeletedAndHidden, includeDeletedAndHidden, lastSyncDate); List<com.google.api.services.tasks.model.Task> tasks = taskList.getItems(); if (tasks != null) { callback.incrementMax(tasks.size() * 10); HashSet<Long> localIds = new HashSet<Long>(tasks.size()); for (com.google.api.services.tasks.model.Task t : tasks) { GtasksTaskContainer container = parseRemoteTask(t, listId); gtasksMetadataService.findLocalMatch(container); container.gtaskMetadata.setValue( GtasksMetadata.GTASKS_ORDER, Long.parseLong(t.getPosition())); container.gtaskMetadata.setValue( GtasksMetadata.PARENT_TASK, gtasksMetadataService.localIdForGtasksId(t.getParent())); container.gtaskMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L); write(container); localIds.add(container.task.getId()); callback.incrementProgress(10); } list.setValue(GtasksList.LAST_SYNC, DateUtilities.now()); storeObjectDao.persist(list); if (lastSyncDate == 0) { Long[] localIdArray = localIds.toArray(new Long[localIds.size()]); Criterion delete = Criterion.and( Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), GtasksMetadata.LIST_ID.eq(listId), Criterion.not(Metadata.TASK.in(localIdArray))); taskService.deleteWhere( Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(delete))); metadataService.deleteWhere(delete); } gtasksTaskListUpdater.correctOrderAndIndentForList(listId); } } catch (GoogleTasksException e) { if (errorHandler != null) errorHandler.handleException("gtasks-sync-io", e, e.getType()); // $NON-NLS-1$ } catch (IOException e) { if (errorHandler != null) errorHandler.handleException("gtasks-sync-io", e, e.toString()); // $NON-NLS-1$ } }
private TodorooCursor<Task> constructCursor() { String tagName = null; if (getActiveTagData() != null) { tagName = getActiveTagData().getName(); } Criterion tagsJoinCriterion = Criterion.and( Field.field(TAGS_METADATA_JOIN + "." + Metadata.KEY.name) .eq(TaskToTagMetadata.KEY), // $NON-NLS-1$ Field.field(TAGS_METADATA_JOIN + "." + Metadata.DELETION_DATE.name).eq(0), Task.ID.eq(Field.field(TAGS_METADATA_JOIN + "." + Metadata.TASK.name))); if (tagName != null) { tagsJoinCriterion = Criterion.and( tagsJoinCriterion, Field.field(TAGS_METADATA_JOIN + "." + TaskToTagMetadata.TAG_NAME.name).neq(tagName)); } // TODO: For now, we'll modify the query to join and include the things like tag data here. // Eventually, we might consider restructuring things so that this query is constructed // elsewhere. String joinedQuery = Join.left(Metadata.TABLE.as(TAGS_METADATA_JOIN), tagsJoinCriterion) .toString() //$NON-NLS-1$ + Join.left( TaskAttachment.TABLE.as(FILE_METADATA_JOIN), Task.UUID.eq(Field.field(FILE_METADATA_JOIN + "." + TaskAttachment.TASK_UUID.name))) + filter.getSqlQuery(); sqlQueryTemplate.set(SortHelper.adjustQueryForFlagsAndSort(joinedQuery, sortFlags, sortSort)); String groupedQuery; if (sqlQueryTemplate.get().contains("GROUP BY")) { groupedQuery = sqlQueryTemplate.get(); } else if (sqlQueryTemplate.get().contains("ORDER BY")) // $NON-NLS-1$ { groupedQuery = sqlQueryTemplate .get() .replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); // $NON-NLS-1$ } else { groupedQuery = sqlQueryTemplate.get() + " GROUP BY " + Task.ID; } sqlQueryTemplate.set(groupedQuery); // Peform query try { return taskService.fetchFiltered(sqlQueryTemplate.get(), null, taskProperties()); } catch (SQLiteException e) { // We don't show this error anymore--seems like this can get triggered // by a strange bug, but there seems to not be any negative side effect. // For now, we'll suppress the error // See http://astrid.com/home#tags-7tsoi/task-1119pk log.error(e.getMessage(), e); return null; } }
/** * Fill in the Task List with current items * * @param withCustomId force task with given custom id to be part of list */ protected void setUpTaskList() { if (filter == null) return; // TODO: For now, we'll modify the query to join and include the task rabbit data here. // Eventually, we might consider restructuring things so that this query is constructed // elsewhere. String joinedTaskRabbitQuery = Join.left( Metadata.TABLE.as(TR_METADATA_JOIN), Criterion.and( Field.field(TR_METADATA_JOIN + "." + Metadata.KEY.name) .eq(TaskRabbitMetadata.METADATA_KEY), // $NON-NLS-1$ Task.ID.eq( Field.field(TR_METADATA_JOIN) + "." + Metadata.TASK.name))) // $NON-NLS-1$ + filter.getSqlQuery(); sqlQueryTemplate.set( SortHelper.adjustQueryForFlagsAndSort(joinedTaskRabbitQuery, sortFlags, sortSort)); // perform query TodorooCursor<Task> currentCursor; try { currentCursor = taskService.fetchFiltered(sqlQueryTemplate.get(), null, taskProperties()); } catch (SQLiteException e) { StartupService.handleSQLiteColumnMissing(getActivity(), e); return; } // set up list adapters taskAdapter = createTaskAdapter(currentCursor); setListAdapter(taskAdapter); getListView().setOnScrollListener(this); registerForContextMenu(getListView()); loadTaskListContent(true); }
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 } }
/** @returns tasks by id */ public static Criterion byId(long id) { return Task.ID.eq(id); }