Read user properties (including pictures) correctly from the activity/users join query. This fixes a lot of UpdateAdapter display bugs

pull/14/head
Sam Bosley 12 years ago
parent 10b2ce40f6
commit 4302475e95

@ -129,12 +129,16 @@ public final class User extends RemoteModel {
}
public String getDisplayName() {
String name = getValue(NAME);
return getDisplayName(NAME, FIRST_NAME, LAST_NAME);
}
public String getDisplayName(StringProperty nameProperty, StringProperty firstNameProperty, StringProperty lastNameProperty) {
String name = getValue(nameProperty);
if (!(TextUtils.isEmpty(name) || "null".equals(name)))
return name;
String firstName = getValue(FIRST_NAME);
String firstName = getValue(firstNameProperty);
boolean firstNameEmpty = TextUtils.isEmpty(firstName) || "null".equals(firstName);
String lastName = getValue(LAST_NAME);
String lastName = getValue(lastNameProperty);
boolean lastNameEmpty = TextUtils.isEmpty(lastName) || "null".equals(lastName);
if (firstNameEmpty && lastNameEmpty)
return getValue(EMAIL);

@ -71,7 +71,7 @@ public class TagCommentsFragment extends CommentsFragment {
@Override
protected Cursor getCursor() {
return tagDataService.getUpdates(tagData);
return tagDataService.getUpdates(tagData, UpdateAdapter.USER_TABLE_ALIAS, UpdateAdapter.USER_PROPERTIES);
}
@Override

@ -301,7 +301,7 @@ public class TagViewFragment extends TaskListFragment {
if (tagData != null) {
long lastViewedComments = Preferences.getLong(CommentsFragment.UPDATES_LAST_VIEWED + tagData.getValue(TagData.UUID), 0);
int unreadCount = 0;
TodorooCursor<UserActivity> commentCursor = tagDataService.getUpdatesWithExtraCriteria(tagData, UserActivity.CREATED_AT.gt(lastViewedComments));
TodorooCursor<UserActivity> commentCursor = tagDataService.getUpdatesWithExtraCriteria(tagData, UserActivity.CREATED_AT.gt(lastViewedComments), null);
try {
unreadCount = commentCursor.getCount();
} finally {

@ -43,6 +43,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
@ -77,10 +78,7 @@ import com.todoroo.astrid.utility.ResourceDrawableCache;
public class EditNoteActivity extends LinearLayout implements TimerActionListener {
public static final String EXTRA_TASK_ID = "task"; //$NON-NLS-1$
private static final String LAST_FETCH_KEY = "task-fetch-"; //$NON-NLS-1$
private Task task;
@ -93,7 +91,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private EditText commentField;
private TextView loadingText;
private final View commentsBar;
private final View parentView;
private View timerView;
private View commentButton;
private int commentItems = 10;
@ -137,7 +134,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
setOrientation(VERTICAL);
commentsBar = parent.findViewById(R.id.updatesFooter);
parentView = parent;
loadViewForTaskID(t);
}
@ -288,9 +284,9 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
}
TodorooCursor<UserActivity> updates = userActivityDao.query(Query.select(AndroidUtilities.addToArray(UserActivity.PROPERTIES, User.PROPERTIES))
TodorooCursor<UserActivity> updates = userActivityDao.query(Query.select(AndroidUtilities.addToArray(UserActivity.PROPERTIES, UpdateAdapter.USER_PROPERTIES))
.where(UserActivity.TARGET_ID.eq(task.getUuid()))
.join(Join.left(User.TABLE, UserActivity.USER_UUID.eq(User.UUID)))
.join(Join.left(User.TABLE.as(UpdateAdapter.USER_TABLE_ALIAS), UserActivity.USER_UUID.eq(Field.field(UpdateAdapter.USER_TABLE_ALIAS + "." + User.UUID.name)))) //$NON-NLS-1$
.orderBy(Order.desc(UserActivity.CREATED_AT)));
try {
UserActivity update = new UserActivity();
@ -300,7 +296,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
user.clear();
update.readFromCursor(updates);
user.readPropertiesFromCursor(updates);
UpdateAdapter.readUserProperties(updates, user);
NoteOrUpdate noa = NoteOrUpdate.fromUpdate(activity, update, user, linkColor);
if(noa != null)
items.add(noa);
@ -497,7 +493,10 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
if (TextUtils.isEmpty(commentPicture))
commentBitmap = u.getPictureBitmap(UserActivity.PICTURE);
Spanned title = UpdateAdapter.getUpdateComment(context, u, user, linkColor, UpdateAdapter.FROM_TASK_VIEW);
return new NoteOrUpdate(user.getPictureUrl(User.PICTURE, RemoteModel.PICTURE_THUMB),
String userImage = ""; //$NON-NLS-1$
if (user.containsNonNullValue(UpdateAdapter.USER_PICTURE))
userImage = user.getPictureUrl(UpdateAdapter.USER_PICTURE, RemoteModel.PICTURE_THUMB);
return new NoteOrUpdate(userImage,
title,
commentPicture,
commentBitmap,

@ -34,6 +34,8 @@ import android.widget.CursorAdapter;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
@ -62,6 +64,20 @@ public class UpdateAdapter extends CursorAdapter {
private final String linkColor;
private final String fromView;
public static final String USER_TABLE_ALIAS = "users_join"; //$NON-NLS-1$
public static final StringProperty USER_PICTURE = new StringProperty(User.TABLE.as(USER_TABLE_ALIAS), User.PICTURE.name).as("userPicture"); //$NON-NLS-1$
private static final StringProperty USER_FIRST_NAME = new StringProperty(User.TABLE.as(USER_TABLE_ALIAS), User.FIRST_NAME.name).as("userFirstName"); //$NON-NLS-1$
private static final StringProperty USER_LAST_NAME = new StringProperty(User.TABLE.as(USER_TABLE_ALIAS), User.LAST_NAME.name).as("userLastName"); //$NON-NLS-1$
private static final StringProperty USER_NAME = new StringProperty(User.TABLE.as(USER_TABLE_ALIAS), User.NAME.name).as("userName"); //$NON-NLS-1$
public static final Property<?>[] USER_PROPERTIES = {
USER_PICTURE,
USER_FIRST_NAME,
USER_LAST_NAME,
USER_NAME
};
private static final String TARGET_LINK_PREFIX = "$link_"; //$NON-NLS-1$
private static final Pattern TARGET_LINK_PATTERN = Pattern.compile("\\" + TARGET_LINK_PREFIX + "(\\w*)"); //$NON-NLS-1$//$NON-NLS-2$
private static final String TASK_LINK_TYPE = "task"; //$NON-NLS-1$
@ -96,6 +112,11 @@ public class UpdateAdapter extends CursorAdapter {
imageCache = ImageDiskCache.getInstance();
this.fromView = fromView;
String[] columns = c.getColumnNames();
for (String s : columns) {
System.err.println("COL: " + s);
}
this.resource = resource;
this.fragment = fragment;
}
@ -140,17 +161,26 @@ public class UpdateAdapter extends CursorAdapter {
User user = mh.user;
user.clear();
user.readPropertiesFromCursor(cursor);
readUserProperties(cursor, user);
setFieldContentsAndVisibility(view, update, user);
}
public static void readUserProperties(TodorooCursor<UserActivity> joinCursor, User user) {
user.setValue(USER_FIRST_NAME, joinCursor.get(USER_FIRST_NAME));
user.setValue(USER_LAST_NAME, joinCursor.get(USER_LAST_NAME));
user.setValue(USER_NAME, joinCursor.get(USER_NAME));
user.setValue(USER_PICTURE, joinCursor.get(USER_PICTURE));
}
/** Helper method to set the contents and visibility of each field */
public synchronized void setFieldContentsAndVisibility(View view, UserActivity activity, User user) {
// picture
final AsyncImageView pictureView = (AsyncImageView)view.findViewById(R.id.picture); {
String pictureUrl = user.getPictureUrl(User.PICTURE, RemoteModel.PICTURE_THUMB);
pictureView.setUrl(pictureUrl);
if (user.containsNonNullValue(USER_PICTURE)) {
String pictureUrl = user.getPictureUrl(USER_PICTURE, RemoteModel.PICTURE_THUMB);
pictureView.setUrl(pictureUrl);
}
}
final AsyncImageView commentPictureView = (AsyncImageView)view.findViewById(R.id.comment_picture); {
@ -193,14 +223,13 @@ public class UpdateAdapter extends CursorAdapter {
else
commentPictureView.setUrl(updatePicture);
if(imageCache.contains(updatePicture)) {
if(imageCache.contains(updatePicture) && updateBitmap == null) {
try {
commentPictureView.setDefaultImageBitmap(imageCache.get(updatePicture));
} catch (IOException e) {
e.printStackTrace();
}
}
else {
} else if (updateBitmap == null) {
commentPictureView.setUrl(updatePicture);
}
@ -243,7 +272,7 @@ public class UpdateAdapter extends CursorAdapter {
} else if (user == null) {
userDisplay = context.getString(R.string.ENA_no_user);
} else {
userDisplay = user.getDisplayName();
userDisplay = user.getDisplayName(USER_NAME, USER_FIRST_NAME, USER_LAST_NAME);
}
if (TextUtils.isEmpty(userDisplay))
userDisplay = context.getString(R.string.ENA_no_user);

@ -5,11 +5,14 @@
*/
package com.todoroo.astrid.service;
import android.text.TextUtils;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
@ -142,26 +145,32 @@ public class TagDataService {
* Get updates for this tagData
* @return
*/
public TodorooCursor<UserActivity> getUpdates(TagData tagData) {
return getUpdatesWithExtraCriteria(tagData, Criterion.all);
public TodorooCursor<UserActivity> getUpdates(TagData tagData, String userTableAlias, Property<?>... userProperties) {
return getUpdatesWithExtraCriteria(tagData, null, userTableAlias, userProperties);
}
private static Query queryForTagData(TagData tagData) {
return Query.select(AndroidUtilities.addToArray(UserActivity.PROPERTIES, User.PROPERTIES)).where(Criterion.or(
private static Query queryForTagData(TagData tagData, Criterion extraCriterion, String userTableAlias, Property<?>[] userProperties) {
Criterion criteria = Criterion.or(
Criterion.and(UserActivity.ACTION.eq(UserActivity.ACTION_TAG_COMMENT), UserActivity.TARGET_ID.eq(tagData.getUuid())),
Criterion.and(UserActivity.ACTION.eq(UserActivity.ACTION_TASK_COMMENT),
UserActivity.TARGET_ID.in(Query.select(TaskToTagMetadata.TASK_UUID)
.from(Metadata.TABLE).where(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(tagData.getUuid())))))))
.join(Join.left(User.TABLE, UserActivity.USER_UUID.eq(User.UUID)));
.from(Metadata.TABLE).where(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(tagData.getUuid()))))));
if (extraCriterion != null)
criteria = Criterion.and(criteria, extraCriterion);
Query result = Query.select(AndroidUtilities.addToArray(UserActivity.PROPERTIES, userProperties)).where(criteria);
if (!TextUtils.isEmpty(userTableAlias))
result = result.join(Join.left(User.TABLE.as(userTableAlias), UserActivity.USER_UUID.eq(Field.field(userTableAlias + "." + User.UUID.name)))); //$NON-NLS-1$
return result;
}
public TodorooCursor<UserActivity> getUpdatesWithExtraCriteria(TagData tagData, Criterion criterion) {
public TodorooCursor<UserActivity> getUpdatesWithExtraCriteria(TagData tagData, Criterion criterion, String userTableAlias, Property<?>... userProperties) {
if (tagData == null)
return userActivityDao.query(Query.select(UserActivity.PROPERTIES).where(
criterion).
orderBy(Order.desc(UserActivity.CREATED_AT)));
return userActivityDao.query(queryForTagData(tagData).orderBy(Order.desc(UserActivity.CREATED_AT)));
return userActivityDao.query(queryForTagData(tagData, criterion, userTableAlias, userProperties).orderBy(Order.desc(UserActivity.CREATED_AT)));
}
/**
@ -173,7 +182,7 @@ public class TagDataService {
if(RemoteModel.NO_UUID.equals(tagData.getValue(TagData.UUID)))
return null;
TodorooCursor<UserActivity> updates = userActivityDao.query(queryForTagData(tagData).orderBy(Order.desc(UserActivity.CREATED_AT)).limit(1));
TodorooCursor<UserActivity> updates = userActivityDao.query(queryForTagData(tagData, null, null, null).orderBy(Order.desc(UserActivity.CREATED_AT)).limit(1));
try {
if(updates.getCount() == 0)
return null;

Loading…
Cancel
Save