예제 #1
0
  /** Populates a view with content */
  @Override
  public void bindView(View view, Context context, Cursor c) {
    TodorooCursor<UserActivity> cursor = (TodorooCursor<UserActivity>) c;
    ModelHolder mh = ((ModelHolder) view.getTag());

    String type = cursor.getString(TYPE_PROPERTY_INDEX);

    UserActivity update = mh.activity;
    update.clear();

    User user = mh.user;
    user.clear();

    History history = mh.history;
    boolean isSelf;
    if (NameMaps.TABLE_ID_USER_ACTIVITY.equals(type)) {
      readUserActivityProperties(cursor, update);
      isSelf = Task.USER_ID_SELF.equals(update.getValue(UserActivity.USER_UUID));
    } else {
      readHistoryProperties(cursor, history);
      isSelf = Task.USER_ID_SELF.equals(history.getValue(History.USER_UUID));
    }
    readUserProperties(cursor, user, self, isSelf);

    setFieldContentsAndVisibility(view, update, user, history, type);
  }
예제 #2
0
  private void setupUserActivityRow(View view, UserActivity activity, User user) {
    final AsyncImageView pictureView = (AsyncImageView) view.findViewById(R.id.picture);
    {
      if (user.containsNonNullValue(USER_PICTURE)) {
        String pictureUrl = user.getPictureUrl(USER_PICTURE, RemoteModel.PICTURE_THUMB);
        pictureView.setUrl(pictureUrl);
      } else {
        pictureView.setUrl(null);
      }
      pictureView.setVisibility(View.VISIBLE);
    }

    final AsyncImageView commentPictureView =
        (AsyncImageView) view.findViewById(R.id.comment_picture);
    {
      String pictureThumb =
          activity.getPictureUrl(UserActivity.PICTURE, RemoteModel.PICTURE_MEDIUM);
      String pictureFull = activity.getPictureUrl(UserActivity.PICTURE, RemoteModel.PICTURE_LARGE);
      Bitmap updateBitmap = null;
      if (TextUtils.isEmpty(pictureThumb))
        updateBitmap = activity.getPictureBitmap(UserActivity.PICTURE);
      setupImagePopupForCommentView(
          view,
          commentPictureView,
          pictureThumb,
          pictureFull,
          updateBitmap,
          activity.getValue(UserActivity.MESSAGE),
          fragment,
          imageCache);
    }

    // name
    final TextView nameView = (TextView) view.findViewById(R.id.title);
    {
      nameView.setText(
          getUpdateComment(
              (AstridActivity) fragment.getActivity(), activity, user, linkColor, fromView));
      nameView.setMovementMethod(new LinkMovementMethod());
      nameView.setTextColor(color);
    }

    // date
    final TextView date = (TextView) view.findViewById(R.id.date);
    {
      CharSequence dateString =
          DateUtils.getRelativeTimeSpanString(
              activity.getValue(UserActivity.CREATED_AT),
              DateUtilities.now(),
              DateUtils.MINUTE_IN_MILLIS,
              DateUtils.FORMAT_ABBREV_RELATIVE);
      date.setText(dateString);
    }
  }
예제 #3
0
  private static CharSequence getLinkSpan(
      final AstridActivity activity,
      UserActivity update,
      String targetName,
      String linkColor,
      String linkType) {
    if (TASK_LINK_TYPE.equals(linkType)) {
      final String taskId = update.getValue(UserActivity.TARGET_ID);
      if (RemoteModel.isValidUuid(taskId)) {
        SpannableString taskSpan = new SpannableString(targetName);
        taskSpan.setSpan(
            new ClickableSpan() {
              @Override
              public void onClick(View widget) {
                if (activity != null) // TODO: This shouldn't happen, but sometimes does
                activity.onTaskListItemClicked(taskId);
              }

              @Override
              public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
              }
            },
            0,
            targetName.length(),
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        return taskSpan;
      } else {
        return Html.fromHtml(linkify(targetName, linkColor));
      }
    }
    return null;
  }
예제 #4
0
 public static void readUserActivityProperties(
     TodorooCursor<UserActivity> unionCursor, UserActivity activity) {
   activity.setValue(UserActivity.CREATED_AT, unionCursor.getLong(0));
   activity.setValue(UserActivity.UUID, unionCursor.getString(1));
   activity.setValue(UserActivity.ACTION, unionCursor.getString(2));
   activity.setValue(UserActivity.MESSAGE, unionCursor.getString(3));
   activity.setValue(UserActivity.TARGET_ID, unionCursor.getString(4));
   activity.setValue(UserActivity.TARGET_NAME, unionCursor.getString(5));
   activity.setValue(UserActivity.PICTURE, unionCursor.getString(6));
   activity.setValue(UserActivity.USER_UUID, unionCursor.getString(7));
 }
예제 #5
0
    public static NoteOrUpdate fromUpdateOrHistory(
        AstridActivity context, UserActivity u, History history, User user, String linkColor) {
      String userImage = ""; // $NON-NLS-1$
      String pictureThumb = ""; // $NON-NLS-1$
      String pictureFull = ""; // $NON-NLS-1$
      Spanned title;
      Bitmap commentBitmap = null;
      long createdAt = 0;
      String type = null;

      if (u != null) {
        pictureThumb = u.getPictureUrl(UserActivity.PICTURE, RemoteModel.PICTURE_MEDIUM);
        pictureFull = u.getPictureUrl(UserActivity.PICTURE, RemoteModel.PICTURE_LARGE);
        if (TextUtils.isEmpty(pictureThumb))
          commentBitmap = u.getPictureBitmap(UserActivity.PICTURE);
        title =
            UpdateAdapter.getUpdateComment(
                context, u, user, linkColor, UpdateAdapter.FROM_TASK_VIEW);
        userImage = ""; // $NON-NLS-1$
        if (user.containsNonNullValue(UpdateAdapter.USER_PICTURE))
          userImage = user.getPictureUrl(UpdateAdapter.USER_PICTURE, RemoteModel.PICTURE_THUMB);
        createdAt = u.getValue(UserActivity.CREATED_AT);
        type = NameMaps.TABLE_ID_USER_ACTIVITY;
      } else {
        if (user.containsNonNullValue(UpdateAdapter.USER_PICTURE))
          userImage = user.getPictureUrl(UpdateAdapter.USER_PICTURE, RemoteModel.PICTURE_THUMB);
        title =
            new SpannableString(
                UpdateAdapter.getHistoryComment(
                    context, history, user, linkColor, UpdateAdapter.FROM_TASK_VIEW));
        createdAt = history.getValue(History.CREATED_AT);
        type = NameMaps.TABLE_ID_HISTORY;
      }

      return new NoteOrUpdate(
          userImage, title, pictureThumb, pictureFull, commentBitmap, createdAt, type);
    }
예제 #6
0
  @SuppressWarnings("nls")
  private void addComment(
      String message, String actionCode, String uuid, String title, boolean usePicture) {
    // Allow for users to just add picture
    if (TextUtils.isEmpty(message) && usePicture) {
      message = " ";
    }
    UserActivity userActivity = new UserActivity();
    userActivity.setValue(UserActivity.MESSAGE, message);
    userActivity.setValue(UserActivity.ACTION, actionCode);
    userActivity.setValue(UserActivity.USER_UUID, Task.USER_ID_SELF);
    userActivity.setValue(UserActivity.TARGET_ID, uuid);
    userActivity.setValue(UserActivity.TARGET_NAME, title);
    userActivity.setValue(UserActivity.CREATED_AT, DateUtilities.now());
    if (usePicture && pendingCommentPicture != null) {
      JSONObject pictureJson =
          RemoteModel.PictureHelper.savePictureJson(activity, pendingCommentPicture);
      if (pictureJson != null) userActivity.setValue(UserActivity.PICTURE, pictureJson.toString());
    }

    userActivityDao.createNew(userActivity);
    if (commentField != null) commentField.setText(""); // $NON-NLS-1$

    pendingCommentPicture = usePicture ? null : pendingCommentPicture;
    if (usePicture) {
      if (activity != null)
        activity.getIntent().removeExtra(TaskEditFragment.TOKEN_PICTURE_IN_PROGRESS);
    }
    if (pictureButton != null) pictureButton.setImageResource(cameraButton);
    StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_COMMENT);

    setUpListAdapter();
    for (UpdatesChangedListener l : listeners) {
      l.commentAdded();
    }
  }
예제 #7
0
  public static Spanned getUpdateComment(
      final AstridActivity context,
      UserActivity activity,
      User user,
      String linkColor,
      String fromView) {
    String userDisplay;
    if (activity.getValue(UserActivity.USER_UUID).equals(Task.USER_ID_SELF)) {
      userDisplay = context.getString(R.string.update_string_user_self);
    } else if (user == null) {
      userDisplay = context.getString(R.string.ENA_no_user);
    } else {
      userDisplay = user.getDisplayName(USER_NAME, USER_FIRST_NAME, USER_LAST_NAME);
    }
    if (TextUtils.isEmpty(userDisplay)) userDisplay = context.getString(R.string.ENA_no_user);
    String targetName = activity.getValue(UserActivity.TARGET_NAME);
    String action = activity.getValue(UserActivity.ACTION);
    String message = activity.getValue(UserActivity.MESSAGE);

    int commentResource = 0;
    if (UserActivity.ACTION_TASK_COMMENT.equals(action)) {
      if (fromView.equals(FROM_TASK_VIEW) || TextUtils.isEmpty(targetName))
        commentResource = R.string.update_string_default_comment;
      else commentResource = R.string.update_string_task_comment;
    } else if (UserActivity.ACTION_TAG_COMMENT.equals(action)) {
      if (fromView.equals(FROM_TAG_VIEW) || TextUtils.isEmpty(targetName))
        commentResource = R.string.update_string_default_comment;
      else commentResource = R.string.update_string_tag_comment;
    }

    if (commentResource == 0)
      return Html.fromHtml(String.format("%s %s", userDisplay, message)); // $NON-NLS-1$

    String original = context.getString(commentResource, userDisplay, targetName, message);
    int taskLinkIndex = original.indexOf(TARGET_LINK_PREFIX);

    if (taskLinkIndex < 0) return Html.fromHtml(original);

    String[] components = original.split(" "); // $NON-NLS-1$
    SpannableStringBuilder builder = new SpannableStringBuilder();
    StringBuilder htmlStringBuilder = new StringBuilder();

    for (String comp : components) {
      Matcher m = TARGET_LINK_PATTERN.matcher(comp);
      if (m.find()) {
        builder.append(Html.fromHtml(htmlStringBuilder.toString()));
        htmlStringBuilder.setLength(0);

        String linkType = m.group(1);
        CharSequence link = getLinkSpan(context, activity, targetName, linkColor, linkType);
        if (link != null) {
          builder.append(link);
          if (!m.hitEnd()) {
            builder.append(comp.substring(m.end()));
          }
          builder.append(' ');
        }
      } else {
        htmlStringBuilder.append(comp);
        htmlStringBuilder.append(' ');
      }
    }

    if (htmlStringBuilder.length() > 0) builder.append(Html.fromHtml(htmlStringBuilder.toString()));

    return builder;
  }
예제 #8
0
  private void setUpListAdapter() {
    items.clear();
    this.removeAllViews();
    historyCount = 0;
    TodorooCursor<Metadata> notes =
        metadataService.query(
            Query.select(Metadata.PROPERTIES)
                .where(MetadataCriteria.byTaskAndwithKey(task.getId(), NoteMetadata.METADATA_KEY)));
    try {
      Metadata metadata = new Metadata();
      for (notes.moveToFirst(); !notes.isAfterLast(); notes.moveToNext()) {
        metadata.readFromCursor(notes);
        items.add(NoteOrUpdate.fromMetadata(metadata));
      }
    } finally {
      notes.close();
    }

    User self = UpdateAdapter.getSelfUser();

    TodorooCursor<UserActivity> updates = taskService.getActivityAndHistoryForTask(task);
    try {
      UserActivity update = new UserActivity();
      History history = new History();
      User user = new User();
      for (updates.moveToFirst(); !updates.isAfterLast(); updates.moveToNext()) {
        update.clear();
        user.clear();

        String type = updates.getString(UpdateAdapter.TYPE_PROPERTY_INDEX);
        NoteOrUpdate noa;
        boolean isSelf;
        if (NameMaps.TABLE_ID_USER_ACTIVITY.equals(type)) {
          UpdateAdapter.readUserActivityProperties(updates, update);
          isSelf = Task.USER_ID_SELF.equals(update.getValue(UserActivity.USER_UUID));
          UpdateAdapter.readUserProperties(updates, user, self, isSelf);
          noa = NoteOrUpdate.fromUpdateOrHistory(activity, update, null, user, linkColor);
        } else {
          UpdateAdapter.readHistoryProperties(updates, history);
          isSelf = Task.USER_ID_SELF.equals(history.getValue(History.USER_UUID));
          UpdateAdapter.readUserProperties(updates, user, self, isSelf);
          noa = NoteOrUpdate.fromUpdateOrHistory(activity, null, history, user, linkColor);
          historyCount++;
        }
        if (noa != null) items.add(noa);
      }
    } finally {
      updates.close();
    }

    Collections.sort(
        items,
        new Comparator<NoteOrUpdate>() {
          @Override
          public int compare(NoteOrUpdate a, NoteOrUpdate b) {
            if (a.createdAt < b.createdAt) return 1;
            else if (a.createdAt == b.createdAt) return 0;
            else return -1;
          }
        });

    for (int i = 0; i < Math.min(items.size(), commentItems); i++) {
      View notesView = this.getUpdateNotes(items.get(i), this);
      this.addView(notesView);
    }

    if (items.size() > commentItems || task.getValue(Task.HISTORY_HAS_MORE) > 0) {
      Button loadMore = new Button(getContext());
      loadMore.setText(R.string.TEA_load_more);
      loadMore.setTextColor(activity.getResources().getColor(R.color.task_edit_deadline_gray));
      loadMore.setBackgroundColor(Color.alpha(0));
      loadMore.setOnClickListener(
          new View.OnClickListener() {
            public void onClick(View v) {
              // Perform action on click
              commentItems += 10;
              setUpListAdapter();
              if (task.getValue(Task.HISTORY_HAS_MORE) > 0)
                new FetchHistory<Task>(
                        taskDao,
                        Task.HISTORY_FETCH_DATE,
                        Task.HISTORY_HAS_MORE,
                        NameMaps.TABLE_ID_TASKS,
                        task.getUuid(),
                        task.getValue(Task.TITLE),
                        0,
                        historyCount,
                        callback)
                    .execute();
            }
          });
      this.addView(loadMore);
    } else if (items.size() == 0) {
      TextView noUpdates = new TextView(getContext());
      noUpdates.setText(R.string.TEA_no_activity);
      noUpdates.setTextColor(activity.getResources().getColor(R.color.task_edit_deadline_gray));
      noUpdates.setLayoutParams(
          new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
      noUpdates.setPadding(10, 10, 10, 10);
      noUpdates.setGravity(Gravity.CENTER);
      noUpdates.setTextSize(16);
      this.addView(noUpdates);
    }

    for (UpdatesChangedListener l : listeners) {
      l.updatesChanged();
    }
  }