mirror of https://github.com/tasks/tasks
Implement UserData message
parent
e7613f0961
commit
ac1fb8fc2f
@ -0,0 +1,97 @@
|
||||
package com.todoroo.astrid.actfm.sync.messages;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.todoroo.andlib.data.AbstractModel;
|
||||
import com.todoroo.andlib.data.Property;
|
||||
import com.todoroo.andlib.data.Property.DoubleProperty;
|
||||
import com.todoroo.andlib.data.Property.IntegerProperty;
|
||||
import com.todoroo.andlib.data.Property.LongProperty;
|
||||
import com.todoroo.andlib.data.Property.PropertyVisitor;
|
||||
import com.todoroo.andlib.data.Property.StringProperty;
|
||||
import com.todoroo.andlib.utility.DateUtilities;
|
||||
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
|
||||
|
||||
@SuppressWarnings("nls")
|
||||
public class JSONChangeToPropertyVisitor implements PropertyVisitor<Void, String> {
|
||||
|
||||
private static final String ERROR_TAG = "actfm-make-changes";
|
||||
|
||||
private final AbstractModel model;
|
||||
private final JSONObject data;
|
||||
|
||||
public JSONChangeToPropertyVisitor(AbstractModel model, JSONObject data) {
|
||||
this.model = model;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visitInteger(Property<Integer> property, String key) {
|
||||
try {
|
||||
int value = data.getInt(key);
|
||||
model.setValue((IntegerProperty) property, value);
|
||||
} catch (JSONException e) {
|
||||
Log.e(ERROR_TAG, "Error reading int value with key " + key + " from JSON " + data, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visitLong(Property<Long> property, String key) {
|
||||
try {
|
||||
long value = data.optLong(key, 0);
|
||||
if (property.checkFlag(Property.PROP_FLAG_USER_ID) && value == ActFmPreferenceService.userId())
|
||||
value = 0;
|
||||
else if (property.checkFlag(Property.PROP_FLAG_DATE)) {
|
||||
String valueString = data.getString(key);
|
||||
try {
|
||||
value = DateUtilities.parseIso8601(valueString).getTime();
|
||||
if (Task.DUE_DATE.equals(property)) {
|
||||
boolean hasDueTime = valueString.endsWith("Z");
|
||||
value = Task.createDueDate(hasDueTime ? Task.URGENCY_SPECIFIC_DAY_TIME : Task.URGENCY_SPECIFIC_DAY, value);
|
||||
}
|
||||
} catch (Exception e){
|
||||
value = 0;
|
||||
}
|
||||
}
|
||||
model.setValue((LongProperty) property, value);
|
||||
} catch (JSONException e) {
|
||||
Log.e(ERROR_TAG, "Error reading long value with key " + key + " from JSON " + data, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visitDouble(Property<Double> property, String key) {
|
||||
try {
|
||||
double value = data.getDouble(key);
|
||||
model.setValue((DoubleProperty) property, value);
|
||||
} catch (JSONException e) {
|
||||
Log.e(ERROR_TAG, "Error reading double value with key " + key + " from JSON " + data, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visitString(Property<String> property, String key) {
|
||||
try {
|
||||
String value = data.getString(key);
|
||||
model.setValue((StringProperty) property, value);
|
||||
} catch (JSONException e) {
|
||||
try {
|
||||
JSONObject object = data.getJSONObject(key);
|
||||
if (object != null)
|
||||
model.setValue((StringProperty) property, object.toString());
|
||||
} catch (JSONException e2) {
|
||||
Log.e(ERROR_TAG, "Error reading JSON value with key " + key + " from JSON " + data, e);
|
||||
}
|
||||
Log.e(ERROR_TAG, "Error reading string value with key " + key + " from JSON " + data, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.todoroo.astrid.actfm.sync.messages;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.todoroo.andlib.data.Property;
|
||||
import com.todoroo.andlib.data.Property.StringProperty;
|
||||
import com.todoroo.astrid.core.PluginServices;
|
||||
import com.todoroo.astrid.dao.UserDao;
|
||||
import com.todoroo.astrid.data.RemoteModel;
|
||||
import com.todoroo.astrid.data.SyncFlags;
|
||||
import com.todoroo.astrid.data.User;
|
||||
|
||||
public class UserData extends ServerToClientMessage {
|
||||
|
||||
private static final String ERROR_TAG = "actfm-user-data"; //$NON-NLS-1$
|
||||
|
||||
public UserData(JSONObject json) {
|
||||
super(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMessage() {
|
||||
UserDao userDao = PluginServices.getUserDao();
|
||||
try {
|
||||
String uuid = json.getString("uuid"); //$NON-NLS-1$
|
||||
User model = new User();
|
||||
JSONChangeToPropertyVisitor visitor = new JSONChangeToPropertyVisitor(model, json);
|
||||
Iterator<String> keys = json.keys();
|
||||
while (keys.hasNext()) {
|
||||
String column = keys.next();
|
||||
Property<?> property = NameMaps.serverColumnNameToLocalProperty(NameMaps.TABLE_ID_USERS, column);
|
||||
if (property != null) { // Unsupported property
|
||||
property.accept(visitor, column);
|
||||
}
|
||||
}
|
||||
|
||||
StringProperty uuidProperty = (StringProperty) NameMaps.serverColumnNameToLocalProperty(NameMaps.TABLE_ID_USERS, "uuid"); //$NON-NLS-1$
|
||||
if (!model.getSetValues().containsKey(uuidProperty.name))
|
||||
model.setValue(uuidProperty, uuid);
|
||||
|
||||
if (model.getSetValues().size() > 0) {
|
||||
if (userDao.update(RemoteModel.UUID_PROPERTY.eq(uuid), model) <= 0) { // If update doesn't update rows. create a new model
|
||||
model.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
|
||||
userDao.createNew(model);
|
||||
}
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(ERROR_TAG, "Error parsing UserData JSON " + json, e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue