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 13 years ago
parent 10b2ce40f6
commit 4302475e95

@ -129,12 +129,16 @@ public final class User extends RemoteModel {
} }
public String getDisplayName() { 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))) if (!(TextUtils.isEmpty(name) || "null".equals(name)))
return name; return name;
String firstName = getValue(FIRST_NAME); String firstName = getValue(firstNameProperty);
boolean firstNameEmpty = TextUtils.isEmpty(firstName) || "null".equals(firstName); 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); boolean lastNameEmpty = TextUtils.isEmpty(lastName) || "null".equals(lastName);
if (firstNameEmpty && lastNameEmpty) if (firstNameEmpty && lastNameEmpty)
return getValue(EMAIL); return getValue(EMAIL);

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

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

@ -43,6 +43,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
@ -77,10 +78,7 @@ import com.todoroo.astrid.utility.ResourceDrawableCache;
public class EditNoteActivity extends LinearLayout implements TimerActionListener { public class EditNoteActivity extends LinearLayout implements TimerActionListener {
public static final String EXTRA_TASK_ID = "task"; //$NON-NLS-1$ 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; private Task task;
@ -93,7 +91,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private EditText commentField; private EditText commentField;
private TextView loadingText; private TextView loadingText;
private final View commentsBar; private final View commentsBar;
private final View parentView;
private View timerView; private View timerView;
private View commentButton; private View commentButton;
private int commentItems = 10; private int commentItems = 10;
@ -137,7 +134,6 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
setOrientation(VERTICAL); setOrientation(VERTICAL);
commentsBar = parent.findViewById(R.id.updatesFooter); commentsBar = parent.findViewById(R.id.updatesFooter);
parentView = parent;
loadViewForTaskID(t); 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())) .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))); .orderBy(Order.desc(UserActivity.CREATED_AT)));
try { try {
UserActivity update = new UserActivity(); UserActivity update = new UserActivity();
@ -300,7 +296,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
user.clear(); user.clear();
update.readFromCursor(updates); update.readFromCursor(updates);
user.readPropertiesFromCursor(updates); UpdateAdapter.readUserProperties(updates, user);
NoteOrUpdate noa = NoteOrUpdate.fromUpdate(activity, update, user, linkColor); NoteOrUpdate noa = NoteOrUpdate.fromUpdate(activity, update, user, linkColor);
if(noa != null) if(noa != null)
items.add(noa); items.add(noa);
@ -497,7 +493,10 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
if (TextUtils.isEmpty(commentPicture)) if (TextUtils.isEmpty(commentPicture))
commentBitmap = u.getPictureBitmap(UserActivity.PICTURE); commentBitmap = u.getPictureBitmap(UserActivity.PICTURE);
Spanned title = UpdateAdapter.getUpdateComment(context, u, user, linkColor, UpdateAdapter.FROM_TASK_VIEW); 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, title,
commentPicture, commentPicture,
commentBitmap, commentBitmap,

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

@ -5,11 +5,14 @@
*/ */
package com.todoroo.astrid.service; package com.todoroo.astrid.service;
import android.text.TextUtils;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
@ -142,26 +145,32 @@ public class TagDataService {
* Get updates for this tagData * Get updates for this tagData
* @return * @return
*/ */
public TodorooCursor<UserActivity> getUpdates(TagData tagData) { public TodorooCursor<UserActivity> getUpdates(TagData tagData, String userTableAlias, Property<?>... userProperties) {
return getUpdatesWithExtraCriteria(tagData, Criterion.all); return getUpdatesWithExtraCriteria(tagData, null, userTableAlias, userProperties);
} }
private static Query queryForTagData(TagData tagData) { private static Query queryForTagData(TagData tagData, Criterion extraCriterion, String userTableAlias, Property<?>[] userProperties) {
return Query.select(AndroidUtilities.addToArray(UserActivity.PROPERTIES, User.PROPERTIES)).where(Criterion.or( 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_TAG_COMMENT), UserActivity.TARGET_ID.eq(tagData.getUuid())),
Criterion.and(UserActivity.ACTION.eq(UserActivity.ACTION_TASK_COMMENT), Criterion.and(UserActivity.ACTION.eq(UserActivity.ACTION_TASK_COMMENT),
UserActivity.TARGET_ID.in(Query.select(TaskToTagMetadata.TASK_UUID) 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()))))))) .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))); 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) if (tagData == null)
return userActivityDao.query(Query.select(UserActivity.PROPERTIES).where( return userActivityDao.query(Query.select(UserActivity.PROPERTIES).where(
criterion). criterion).
orderBy(Order.desc(UserActivity.CREATED_AT))); 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))) if(RemoteModel.NO_UUID.equals(tagData.getValue(TagData.UUID)))
return null; 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 { try {
if(updates.getCount() == 0) if(updates.getCount() == 0)
return null; return null;

Loading…
Cancel
Save