GtasksList wraps StoreObject

pull/253/head
Alex Baker 10 years ago
parent bbaabf8770
commit eb59cde024

@ -102,4 +102,5 @@ dependencies {
androidTestCompile group: 'org.mockito', name: 'mockito-core', version: '1.9.5', transitive: false
androidTestCompile group: 'com.google.dexmaker', name: 'dexmaker', version: '1.1'
androidTestCompile group: 'com.google.dexmaker', name: 'dexmaker-mockito', version: '1.1'
androidTestCompile group: 'com.natpryce', name: 'make-it-easy', version: '3.1.0', transitive: false
}

@ -30,7 +30,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
@Inject GtasksMetadata gtasksMetadata;
private Task task;
private StoreObject storeList;
private GtasksList storeList;
public void testIndentWithoutMetadata() {
givenTask(taskWithoutMetadata());

@ -0,0 +1,100 @@
package com.todoroo.astrid.gtasks;
import com.google.api.client.util.DateTime;
import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.test.DatabaseTestCase;
import org.tasks.makers.RemoteGtaskListMaker;
import javax.inject.Inject;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static java.util.Arrays.asList;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.makers.GtaskListMaker.LAST_SYNC;
import static org.tasks.makers.GtaskListMaker.NAME;
import static org.tasks.makers.GtaskListMaker.REMOTE_ID;
import static org.tasks.makers.GtaskListMaker.newGtaskList;
import static org.tasks.makers.RemoteGtaskListMaker.newRemoteList;
public class GtasksListServiceTest extends DatabaseTestCase {
@Inject Database database;
private StoreObjectDao storeObjectDao;
private GtasksListService gtasksListService;
@Override
public void setUp() {
super.setUp();
storeObjectDao = spy(new StoreObjectDao(database));
gtasksListService = new GtasksListService(storeObjectDao);
}
public void testCreateNewList() {
setLists(newRemoteList(
with(RemoteGtaskListMaker.REMOTE_ID, "1"),
with(RemoteGtaskListMaker.NAME, "Default")));
verify(storeObjectDao).persist(newGtaskList(
with(REMOTE_ID, "1"),
with(NAME, "Default")));
}
public void testGetListByRemoteId() {
GtasksList list = newGtaskList(with(REMOTE_ID, "1"));
storeObjectDao.createNew(list.getStoreObject());
assertEquals(list, gtasksListService.getList("1"));
}
public void testGetListReturnsNullWhenNotFound() {
assertNull(gtasksListService.getList("1"));
}
public void testDeleteMissingList() {
storeObjectDao.createNew(newGtaskList(with(REMOTE_ID, "1")).getStoreObject());
setLists(newRemoteList(with(RemoteGtaskListMaker.REMOTE_ID, "2")));
verify(storeObjectDao).delete(1L);
}
public void testUpdateListName() {
storeObjectDao.createNew(newGtaskList(
with(REMOTE_ID, "1"),
with(NAME, "oldName")).getStoreObject());
setLists(newRemoteList(
with(RemoteGtaskListMaker.REMOTE_ID, "1"),
with(RemoteGtaskListMaker.NAME, "newName")));
assertEquals("newName", storeObjectDao.getGtasksList(1).getName());
}
public void testNewListLastSyncIsZero() {
setLists(new TaskList().setId("1"));
assertEquals(0L, gtasksListService.getList("1").getLastSync());
}
public void testNewListNeedsUpdate() {
TaskList taskList = new TaskList().setId("1").setTitle("Default").setUpdated(new DateTime(currentTimeMillis()));
setLists(taskList);
assertEquals(
asList(newGtaskList(with(REMOTE_ID, "1"), with(LAST_SYNC, 0L))),
gtasksListService.getListsToUpdate(new TaskLists().setItems(asList(taskList))));
}
private void setLists(TaskList... list) {
gtasksListService.updateLists(new TaskLists().setItems(
asList(list)));
}
}

@ -9,7 +9,6 @@ import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -145,14 +144,14 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
}
void createParentSiblingMaps() {
for(StoreObject list : gtasksListService.getLists()) {
for(GtasksList list : gtasksListService.getLists()) {
gtasksTaskListUpdater.updateParentSiblingMapsFor(list);
}
}
private void whenCalculatingOrder() {
for(StoreObject list : gtasksListService.getLists())
gtasksTaskListUpdater.correctMetadataForList(list.getValue(GtasksList.REMOTE_ID));
for(GtasksList list : gtasksListService.getLists())
gtasksTaskListUpdater.correctMetadataForList(list.getRemoteId());
}

@ -9,7 +9,6 @@ import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -32,7 +31,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
@Inject GtasksMetadata gtasksMetadata;
private Task A, B, C, D, E, F;
private StoreObject list;
private GtasksList list;
/* Starting State:
*

@ -27,7 +27,6 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.tasks.TestUtilities.initializeMockito;
public class NotificationTests extends DatabaseTestCase {
@ -51,12 +50,6 @@ public class NotificationTests extends DatabaseTestCase {
@Inject NotificationManager notificationManager;
@Inject Broadcaster broadcaster;
@Override
public void setUp() {
initializeMockito(getContext());
super.setUp();
}
@Override
protected void tearDown() {
super.tearDown();

@ -6,12 +6,16 @@ import com.todoroo.andlib.service.ContextManager;
import dagger.ObjectGraph;
import static org.tasks.TestUtilities.initializeMockito;
public abstract class InjectingTestCase extends AndroidTestCase {
@Override
protected void setUp() {
ContextManager.setContext(getContext());
initializeMockito(getContext());
ObjectGraph objectGraph = ObjectGraph.create(new TestModule(getContext()));
Object extension = getModule();
if (extension != null) {

@ -7,6 +7,7 @@ import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDaoTests;
import com.todoroo.astrid.dao.TaskDaoTests;
import com.todoroo.astrid.gtasks.GtasksIndentActionTest;
import com.todoroo.astrid.gtasks.GtasksListServiceTest;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdaterTest;
import com.todoroo.astrid.gtasks.GtasksTaskMovingTest;
import com.todoroo.astrid.model.TaskTest;
@ -43,7 +44,8 @@ import dagger.Provides;
ReminderServiceTest.class,
SubtasksHelperTest.class,
SubtasksMovingTest.class,
SyncModelTest.class
SyncModelTest.class,
GtasksListServiceTest.class
})
public class TestModule {
private Context context;

@ -0,0 +1,38 @@
package org.tasks.makers;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Property;
import com.natpryce.makeiteasy.PropertyLookup;
import com.natpryce.makeiteasy.PropertyValue;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.gtasks.GtasksList;
import static com.natpryce.makeiteasy.Property.newProperty;
import static org.tasks.makers.Maker.make;
public class GtaskListMaker {
public static final Property<GtasksList, Long> ID = newProperty();
public static final Property<GtasksList, Integer> ORDER = newProperty();
public static final Property<GtasksList, String> REMOTE_ID = newProperty();
public static final Property<GtasksList, Long> LAST_SYNC = newProperty();
public static final Property<GtasksList, String> NAME = newProperty();
public static GtasksList newGtaskList(PropertyValue<? super GtasksList, ?>... properties) {
return make(instantiator, properties);
}
private static final Instantiator<GtasksList> instantiator = new Instantiator<GtasksList>() {
@Override
public GtasksList instantiate(final PropertyLookup<GtasksList> lookup) {
return new GtasksList(new StoreObject() {{
setType(GtasksList.TYPE);
setValue(StoreObject.ID, lookup.valueOf(GtaskListMaker.ID, 1L));
setValue(StoreObject.ITEM, lookup.valueOf(REMOTE_ID, "1"));
setValue(StoreObject.VALUE1, lookup.valueOf(NAME, "Default"));
setValue(StoreObject.VALUE2, String.valueOf(lookup.valueOf(ORDER, 0)));
setValue(StoreObject.VALUE3, String.valueOf(lookup.valueOf(LAST_SYNC, 0L)));
}});
}
};
}

@ -0,0 +1,13 @@
package org.tasks.makers;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.PropertyValue;
import static com.natpryce.makeiteasy.MakeItEasy.a;
public class Maker {
@SuppressWarnings("unchecked")
public static <T> T make(Instantiator<T> instantiator, PropertyValue<? super T, ?>... properties) {
return com.natpryce.makeiteasy.MakeItEasy.make(a(instantiator, properties));
}
}

@ -0,0 +1,31 @@
package org.tasks.makers;
import com.google.api.client.util.DateTime;
import com.google.api.services.tasks.model.TaskList;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Property;
import com.natpryce.makeiteasy.PropertyLookup;
import com.natpryce.makeiteasy.PropertyValue;
import static com.natpryce.makeiteasy.Property.newProperty;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
import static org.tasks.makers.Maker.make;
public class RemoteGtaskListMaker {
public static final Property<TaskList, String> REMOTE_ID = newProperty();
public static final Property<TaskList, String> NAME = newProperty();
public static TaskList newRemoteList(PropertyValue<? super TaskList, ?>... properties) {
return make(instantiator, properties);
}
private static final Instantiator<TaskList> instantiator = new Instantiator<TaskList>() {
@Override
public TaskList instantiate(final PropertyLookup<TaskList> lookup) {
return new TaskList()
.setId(lookup.valueOf(REMOTE_ID, "1"))
.setTitle(lookup.valueOf(NAME, "Default"))
.setUpdated(new DateTime(currentTimeMillis()));
}
};
}

@ -138,11 +138,11 @@ public abstract class AbstractModel implements Parcelable, Cloneable {
*/
@Override
public boolean equals(Object other) {
if(other == null || other.getClass() != getClass()) {
if(other == null || other.getClass() != getClass()) {
return false;
}
return getMergedValues().equals(((AbstractModel)other).getMergedValues());
return getMergedValues().equals(((AbstractModel) other).getMergedValues());
}
@Override

@ -5,18 +5,22 @@
*/
package com.todoroo.astrid.dao;
import com.google.common.base.Function;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Order;
import com.todoroo.astrid.core.SavedFilter;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.gtasks.GtasksList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static com.todoroo.andlib.sql.Criterion.and;
import static com.todoroo.andlib.sql.Query.select;
@ -37,6 +41,27 @@ public class StoreObjectDao extends DatabaseDao<StoreObject> {
.orderBy(Order.asc(SavedFilter.NAME)));
}
public GtasksList getGtasksList(long id) {
StoreObject result = fetch(id, StoreObject.PROPERTIES);
if (!result.getType().equals(GtasksList.TYPE)) {
throw new RuntimeException("Not a google task list");
}
return new GtasksList(result);
}
public List<GtasksList> getGtasksLists() {
return newArrayList(transform(getByType(GtasksList.TYPE), new Function<StoreObject, GtasksList>() {
@Override
public GtasksList apply(StoreObject input) {
return new GtasksList(input);
}
}));
}
public void persist(GtasksList list) {
persist(list.getStoreObject());
}
public List<StoreObject> getByType(String type) {
return toList(select(StoreObject.PROPERTIES)
.where(StoreObject.TYPE.eq(type)));

@ -88,4 +88,14 @@ public class StoreObject extends AbstractModel {
public void setType(String type) {
setValue(TYPE, type);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof StoreObject)) return false;
StoreObject that = (StoreObject) o;
return getMergedValues().equals(that.getMergedValues());
}
}

@ -22,7 +22,6 @@ import com.todoroo.astrid.api.MultipleSelectCriterion;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import org.tasks.R;
@ -53,14 +52,14 @@ public class GtasksCustomFilterCriteriaExposer extends InjectingBroadcastReceive
Resources r = context.getResources();
List<StoreObject> lists = gtasksListService.getLists();
List<GtasksList> lists = gtasksListService.getLists();
CustomFilterCriterion[] result = new CustomFilterCriterion[1];
String[] listNames = new String[lists.size()];
String[] listIds = new String[lists.size()];
for (int i = 0; i < lists.size(); i++) {
listNames[i] = lists.get(i).getValue(GtasksList.NAME);
listIds[i] = lists.get(i).getValue(GtasksList.REMOTE_ID);
listNames[i] = lists.get(i).getName();
listIds[i] = lists.get(i).getRemoteId();
}
ContentValues values = new ContentValues();

@ -24,7 +24,6 @@ import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import org.tasks.R;
@ -49,21 +48,21 @@ public class GtasksFilterExposer extends InjectingBroadcastReceiver implements A
@Inject @ForApplication Context context;
@Inject GtasksMetadata gtasksMetadata;
private List<StoreObject> lists;
private List<GtasksList> lists;
public static Filter filterFromList(GtasksMetadata gtasksMetadata, Context context, StoreObject list) {
String listName = list.getValue(GtasksList.NAME);
public static Filter filterFromList(GtasksMetadata gtasksMetadata, Context context, GtasksList list) {
String listName = list.getName();
ContentValues values = new ContentValues();
values.putAll(gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues());
values.remove(Metadata.TASK.name);
values.put(GtasksMetadata.LIST_ID.name, list.getValue(GtasksList.REMOTE_ID));
values.put(GtasksMetadata.LIST_ID.name, list.getRemoteId());
values.put(GtasksMetadata.ORDER.name, PermaSql.VALUE_NOW);
FilterWithCustomIntent filter = new FilterWithCustomIntent(listName,
context.getString(R.string.gtasks_FEx_title, listName), new QueryTemplate().join(
Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
TaskCriteria.notDeleted(),
GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))).orderBy(
GtasksMetadata.LIST_ID.eq(list.getRemoteId()))).orderBy(
Order.asc(Functions.cast(GtasksMetadata.ORDER, "LONG"))), //$NON-NLS-1$
values);
filter.customTaskList = new ComponentName(context, GtasksListFragment.class);

@ -5,35 +5,94 @@
*/
package com.todoroo.astrid.gtasks;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.data.StoreObject;
/**
* {@link StoreObject} entries for a GTasks List
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class GtasksList {
/** type*/
private StoreObject storeObject;
public GtasksList(final String remoteId) {
this(new StoreObject() {{
setType(GtasksList.TYPE);
}});
setLastSync(0L);
setRemoteId(remoteId);
}
public GtasksList(StoreObject storeObject) {
if (!storeObject.getType().equals(TYPE)) {
throw new RuntimeException("Type is not " + TYPE);
}
this.storeObject = storeObject;
}
/**
* type
*/
public static final String TYPE = "gtasks-list"; //$NON-NLS-1$
/** list id in g-tasks */
public static final StringProperty REMOTE_ID = new StringProperty(StoreObject.TABLE,
StoreObject.ITEM.name);
public Long getId() {
return storeObject.getId();
}
public String getRemoteId() {
return storeObject.getValue(StoreObject.ITEM);
}
public void setRemoteId(String remoteId) {
storeObject.setValue(StoreObject.ITEM, remoteId);
}
public String getName() {
return storeObject.getValue(StoreObject.VALUE1);
}
public void setName(String name) {
storeObject.setValue(StoreObject.VALUE1, name);
}
public int getOrder() {
return Integer.parseInt(storeObject.getValue(StoreObject.VALUE2));
}
public void setOrder(int order) {
storeObject.setValue(StoreObject.VALUE2, Integer.toString(order));
}
public long getLastSync() {
return storeObject.containsNonNullValue(StoreObject.VALUE3)
? Long.parseLong(storeObject.getValue(StoreObject.VALUE3))
: 0;
}
public void setLastSync(long timestamp) {
storeObject.setValue(StoreObject.VALUE3, Long.toString(timestamp));
}
public StoreObject getStoreObject() {
return storeObject;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GtasksList)) return false;
/** list name */
public static final StringProperty NAME = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE1.name);
GtasksList that = (GtasksList) o;
/** list order */
public static final IntegerProperty ORDER = new IntegerProperty(StoreObject.TABLE,
StoreObject.VALUE2.name);
if (storeObject != null ? !storeObject.equals(that.storeObject) : that.storeObject != null)
return false;
public static final LongProperty LAST_SYNC = new LongProperty(StoreObject.TABLE,
StoreObject.VALUE3.name);
return true;
}
@Override
public int hashCode() {
return storeObject != null ? storeObject.hashCode() : 0;
}
}

@ -21,7 +21,6 @@ import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TaskService;
@ -52,16 +51,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Inject ActivityPreferences preferences;
@Inject SyncThrottle syncThrottle;
private StoreObject list;
private static final Property<?>[] LIST_PROPERTIES = new Property<?>[] {
StoreObject.ID,
StoreObject.TYPE,
GtasksList.REMOTE_ID,
GtasksList.ORDER,
GtasksList.NAME,
GtasksList.LAST_SYNC
};
private GtasksList list;
@Override
protected OrderedListFragmentHelperInterface<?> createFragmentHelper() {
@ -73,8 +63,8 @@ public class GtasksListFragment extends SubtasksListFragment {
super.onActivityCreated(icicle);
long storeObjectId = extras.getLong(TOKEN_STORE_ID, 0);
list = storeObjectDao.fetch(storeObjectId, LIST_PROPERTIES);
((OrderedMetadataListFragmentHelper<StoreObject>)helper).setList(list);
list = storeObjectDao.getGtasksList(storeObjectId);
((OrderedMetadataListFragmentHelper<GtasksList>)helper).setList(list);
}
@Override

@ -8,26 +8,23 @@ package com.todoroo.astrid.gtasks;
import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.data.StoreObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
import static com.google.common.collect.Lists.newArrayList;
import static org.tasks.date.DateTimeUtils.newDateTime;
public class GtasksListService {
private static final Logger log = LoggerFactory.getLogger(GtasksListService.class);
public static final StoreObject LIST_NOT_FOUND_OBJECT = null;
private final StoreObjectDao storeObjectDao;
@Inject
@ -35,8 +32,8 @@ public class GtasksListService {
this.storeObjectDao = storeObjectDao;
}
public List<StoreObject> getLists() {
return storeObjectDao.getByType(GtasksList.TYPE);
public List<GtasksList> getLists() {
return storeObjectDao.getGtasksLists();
}
/**
@ -45,10 +42,10 @@ public class GtasksListService {
* @param remoteLists remote information about your lists
*/
public synchronized void updateLists(TaskLists remoteLists) {
List<StoreObject> lists = getLists();
List<GtasksList> lists = getLists();
Set<Long> previousLists = new HashSet<>();
for(StoreObject list : lists) {
for(GtasksList list : lists) {
previousLists.add(list.getId());
}
@ -57,9 +54,9 @@ public class GtasksListService {
com.google.api.services.tasks.model.TaskList remote = items.get(i);
String id = remote.getId();
StoreObject local = null;
for(StoreObject list : lists) {
if(list.getValue(GtasksList.REMOTE_ID).equals(id)) {
GtasksList local = null;
for(GtasksList list : lists) {
if(list.getRemoteId().equals(id)) {
local = list;
break;
}
@ -68,14 +65,11 @@ public class GtasksListService {
String title = remote.getTitle();
if(local == null) {
log.debug("Adding new gtask list {}", title);
local = new StoreObject();
local.setValue(GtasksList.LAST_SYNC, 0L);
local = new GtasksList(id);
}
local.setType(GtasksList.TYPE);
local.setValue(GtasksList.REMOTE_ID, id);
local.setValue(GtasksList.NAME, title);
local.setValue(GtasksList.ORDER, i);
local.setName(title);
local.setOrder(i);
storeObjectDao.persist(local);
previousLists.remove(local.getId());
}
@ -86,12 +80,29 @@ public class GtasksListService {
}
}
public StoreObject getList(String listId) {
for(StoreObject list : getLists()) {
if (list != null && list.getValue(GtasksList.REMOTE_ID).equals(listId)) {
public List<GtasksList> getListsToUpdate(TaskLists remoteLists) {
List<GtasksList> listsToUpdate = newArrayList();
for (TaskList remoteList : remoteLists.getItems()) {
GtasksList localList = getList(remoteList.getId());
String listName = localList.getName();
Long lastSync = localList.getLastSync();
long lastUpdate = remoteList.getUpdated().getValue();
if (lastSync < lastUpdate) {
listsToUpdate.add(localList);
log.debug("{} out of date [local={}] [remote={}]", listName, newDateTime(lastSync), newDateTime(lastUpdate));
} else {
log.debug("{} up to date", listName);
}
}
return listsToUpdate;
}
public GtasksList getList(String listId) {
for(GtasksList list : getLists()) {
if (list != null && list.getRemoteId().equals(listId)) {
return list;
}
}
return LIST_NOT_FOUND_OBJECT;
return null;
}
}

@ -19,7 +19,6 @@ import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer;
import com.todoroo.astrid.gtasks.OrderedMetadataListUpdater.OrderedListIterator;
@ -148,8 +147,8 @@ public final class GtasksMetadataService {
// --- list iterating helpers
public void iterateThroughList(StoreObject list, OrderedListIterator iterator) {
String listId = list.getValue(GtasksList.REMOTE_ID);
public void iterateThroughList(GtasksList list, OrderedListIterator iterator) {
String listId = list.getRemoteId();
iterateThroughList(listId, iterator, 0, false);
}

@ -16,7 +16,6 @@ import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
@ -33,7 +32,7 @@ import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObject> {
public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList> {
private static final Logger log = LoggerFactory.getLogger(GtasksTaskListUpdater.class);
@ -85,19 +84,19 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
return gtasksMetadataService.getTaskMetadata(taskId);
}
@Override
protected Metadata createEmptyMetadata(StoreObject list, long taskId) {
protected Metadata createEmptyMetadata(GtasksList list, long taskId) {
Metadata metadata = gtasksMetadata.createEmptyMetadata(taskId);
metadata.setValue(GtasksMetadata.LIST_ID, list.getValue(GtasksList.REMOTE_ID));
metadata.setValue(GtasksMetadata.LIST_ID, list.getRemoteId());
return metadata;
}
@Override
protected void beforeIndent(StoreObject list) {
protected void beforeIndent(GtasksList list) {
updateParentSiblingMapsFor(list);
}
@Override
protected void iterateThroughList(StoreObject list, OrderedListIterator iterator) {
protected void iterateThroughList(GtasksList list, OrderedListIterator iterator) {
gtasksMetadataService.iterateThroughList(list, iterator);
}
@ -112,8 +111,8 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
* Update order, parent, and indentation fields for all tasks in the given list
*/
public void correctMetadataForList(String listId) {
StoreObject list = gtasksListService.getList(listId);
if(list == GtasksListService.LIST_NOT_FOUND_OBJECT) {
GtasksList list = gtasksListService.getList(listId);
if(list == null) {
return;
}
@ -171,7 +170,7 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
);
}
void updateParentSiblingMapsFor(StoreObject list) {
void updateParentSiblingMapsFor(GtasksList list) {
final AtomicLong previousTask = new AtomicLong(Task.NO_ID);
final AtomicInteger previousIndent = new AtomicInteger(-1);

@ -8,7 +8,6 @@ package com.todoroo.astrid.gtasks.sync;
import android.content.Context;
import android.text.TextUtils;
import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.google.api.services.tasks.model.Tasks;
import com.todoroo.andlib.data.AbstractModel;
@ -21,7 +20,6 @@ import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksList;
@ -51,9 +49,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import javax.inject.Inject;
import javax.inject.Singleton;
import static com.google.common.collect.Lists.newArrayList;
import static org.tasks.date.DateTimeUtils.newDate;
import static org.tasks.date.DateTimeUtils.newDateTime;
@Singleton
public class GtasksSyncV2Provider {
@ -152,19 +148,7 @@ public class GtasksSyncV2Provider {
return;
}
List<StoreObject> listsToUpdate = newArrayList();
for (TaskList remoteList : remoteLists.getItems()) {
StoreObject localList = gtasksListService.getList(remoteList.getId());
String listName = localList.getValue(GtasksList.NAME);
Long lastSync = localList.getValue(GtasksList.LAST_SYNC);
long lastUpdate = remoteList.getUpdated().getValue();
if (lastSync < lastUpdate) {
listsToUpdate.add(localList);
log.debug("{} out of date [local={}] [remote={}]", listName, newDateTime(lastSync), newDateTime(lastUpdate));
} else {
log.debug("{} up to date", listName);
}
}
List<GtasksList> listsToUpdate = gtasksListService.getListsToUpdate(remoteLists);
if (listsToUpdate.isEmpty()) {
finishSync(callback);
@ -173,7 +157,7 @@ public class GtasksSyncV2Provider {
final AtomicInteger finisher = new AtomicInteger(listsToUpdate.size());
for (final StoreObject list : listsToUpdate) {
for (final GtasksList list : listsToUpdate) {
executor.execute(callback, new Runnable() {
@Override
public void run() {
@ -215,15 +199,7 @@ public class GtasksSyncV2Provider {
}
}
public void synchronizeList(Object list, final SyncResultCallback callback) {
if (!(list instanceof StoreObject)) {
return;
}
final StoreObject gtasksList = (StoreObject) list;
if (!GtasksList.TYPE.equals(gtasksList.getType())) {
return;
}
public void synchronizeList(final GtasksList gtasksList, final SyncResultCallback callback) {
executor.execute(callback, new Runnable() {
@Override
public void run() {
@ -255,13 +231,10 @@ public class GtasksSyncV2Provider {
return authToken;
}
private synchronized void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
private synchronized void synchronizeListHelper(GtasksList list, GtasksInvoker invoker,
SyncExceptionHandler errorHandler) {
String listId = list.getValue(GtasksList.REMOTE_ID);
long lastSyncDate = 0;
if (list.containsNonNullValue(GtasksList.LAST_SYNC)) {
lastSyncDate = list.getValue(GtasksList.LAST_SYNC);
}
String listId = list.getRemoteId();
long lastSyncDate = list.getLastSync();
/**
* Find tasks which have been associated with the list internally, but have not yet been
@ -292,7 +265,7 @@ public class GtasksSyncV2Provider {
write(container);
lastSyncDate = Math.max(lastSyncDate, container.getUpdateTime());
}
list.setValue(GtasksList.LAST_SYNC, lastSyncDate);
list.setLastSync(lastSyncDate);
storeObjectDao.persist(list);
gtasksTaskListUpdater.correctOrderAndIndentForList(listId);
}

@ -7,6 +7,7 @@ package com.todoroo.astrid.service;
import android.content.Context;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.gtasks.sync.GtasksSyncV2Provider;
import com.todoroo.astrid.sync.SyncResultCallback;
@ -63,7 +64,7 @@ public class SyncV2Service {
* @param list list object
* @param callback result callback
*/
public void synchronizeList(Object list, SyncResultCallback callback) {
public void synchronizeList(GtasksList list, SyncResultCallback callback) {
if(provider.isActive()) {
provider.synchronizeList(list, new WidgetUpdatingCallbackWrapper(context, callback));
}

@ -342,7 +342,7 @@ public class DraggableListView extends ListView {
} catch (InterruptedException e) {
// bye!
log.debug(e.getMessage(), e);
log.trace(e.getMessage(), e);
}
}
}

Loading…
Cancel
Save