From 27450795999730d2890501856b40c4c2aec7dbb0 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 16 Apr 2012 14:56:15 -0700 Subject: [PATCH] Awesome new stuff for putting links in comments. Works for tasks, can adapt to things like tags/users in the future --- astrid/res/values/strings-updates.xml | 16 +-- .../todoroo/astrid/adapter/UpdateAdapter.java | 113 ++++++++++-------- 2 files changed, 72 insertions(+), 57 deletions(-) diff --git a/astrid/res/values/strings-updates.xml b/astrid/res/values/strings-updates.xml index 91795ed85..eff8ea55f 100644 --- a/astrid/res/values/strings-updates.xml +++ b/astrid/res/values/strings-updates.xml @@ -8,15 +8,15 @@ %1$s wants to be friends with you %1$s has confirmed your friendship request %1$s created this task - %1$s created @task - %1$s added @task to this list - %1$s completed @task. Huzzah! - %1$s un-completed @task. - %1$s added @task to %4$s - %1$s added @task to this list - %1$s assigned @task to %4$s + %1$s created @link_task + %1$s added @link_task to this list + %1$s completed @link_task. Huzzah! + %1$s un-completed @link_task. + %1$s added @link_task to %4$s + %1$s added @link_task to this list + %1$s assigned @link_task to %4$s %1$s commented: %3$s - %1$s Re: @task: %3$s + %1$s Re: @link_task: %3$s %1$s Re: %2$s: %3$s %1$s created this list %1$s created the list %2$s diff --git a/astrid/src/com/todoroo/astrid/adapter/UpdateAdapter.java b/astrid/src/com/todoroo/astrid/adapter/UpdateAdapter.java index 342ea361b..65f69286b 100644 --- a/astrid/src/com/todoroo/astrid/adapter/UpdateAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/UpdateAdapter.java @@ -1,7 +1,8 @@ package com.todoroo.astrid.adapter; import java.io.IOException; -import java.util.regex.PatternSyntaxException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.json.JSONException; import org.json.JSONObject; @@ -59,7 +60,11 @@ public class UpdateAdapter extends CursorAdapter { private final String linkColor; private final String fromView; - private static final String TASK_LINK_TOKEN = "@task"; //$NON-NLS-1$ + private static final String TARGET_LINK_PREFIX = "@link_"; //$NON-NLS-1$ + private static final String TARGET_LINK_EXPR = TARGET_LINK_PREFIX + "(\\w*)"; //$NON-NLS-1$ + private static final String TASK_LINK_TYPE = "task"; //$NON-NLS-1$ + + private static final Pattern TARGET_LINK_PATTERN = Pattern.compile(TARGET_LINK_EXPR); private static final String UPDATE_FRIENDS = "friends"; //$NON-NLS-1$ private static final String UPDATE_REQUEST_FRIENDSHIP = "request_friendship"; //$NON-NLS-1$ @@ -238,21 +243,14 @@ public class UpdateAdapter extends CursorAdapter { otherUser = new JSONObject(); } - long taskId = update.getValue(Update.TASK_LOCAL); - if (taskId <= 0) { - Task local = PluginServices.getTaskService().fetchByRemoteId(update.getValue(Update.TASK), Task.ID); - if (local != null) - taskId = local.getId(); - } - - return getUpdateComment(activity, update.getValue(Update.ACTION_CODE), + return getUpdateComment(activity, update, update.getValue(Update.ACTION_CODE), user.optString("name"), update.getValue(Update.TARGET_NAME), update.getValue(Update.MESSAGE), otherUser.optString("name"), - update.getValue(Update.ACTION), linkColor, fromView, taskId); + update.getValue(Update.ACTION), linkColor, fromView); } - public static Spanned getUpdateComment (final AstridActivity activity, String actionCode, String user, String targetName, - String message, String otherUser, String action, String linkColor, String fromView, final long taskId) { + public static Spanned getUpdateComment (final AstridActivity activity, Update update, String actionCode, String user, String targetName, + String message, String otherUser, String action, String linkColor, String fromView) { if (TextUtils.isEmpty(user)) { user = ContextManager.getString(R.string.ENA_no_user); } @@ -319,51 +317,68 @@ public class UpdateAdapter extends CursorAdapter { } String original = ContextManager.getString(commentResource, userLink, targetNameLink, message, otherUserLink); - int taskLinkIndex = original.indexOf(TASK_LINK_TOKEN); + int taskLinkIndex = original.indexOf(TARGET_LINK_PREFIX); if (taskLinkIndex < 0) return Html.fromHtml(original); - if (taskId <= 0 || activity == null) { - original = original.replace(TASK_LINK_TOKEN, targetNameLink); - return Html.fromHtml(original); - } - - try { - SpannableStringBuilder builder = new SpannableStringBuilder(); - SpannableString taskSpan = new SpannableString(targetName); - taskSpan.setSpan(new ClickableSpan() { - @Override - public void onClick(View widget) { - activity.onTaskListItemClicked(taskId); + 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(activity, update, actionCode, user, + targetName, message, otherUser, action, linkColor, linkType); + if (link != null) { + builder.append(link); + if (!m.hitEnd()) { + builder.append(comp.substring(m.end())); + } + builder.append(' '); } - }, 0, targetName.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - - String[] components = original.split(TASK_LINK_TOKEN); - if (components.length > 1) { - Spanned comp1 = Html.fromHtml(components[0]); - Spanned comp2 = Html.fromHtml(components[1]); - - builder.append(comp1) - .append(taskSpan) - .append(' ') - .append(comp2); - } else if (original.endsWith(TASK_LINK_TOKEN)) { - Spanned startComp = Html.fromHtml(components[0]); - builder.append(startComp) - .append(taskSpan); } else { - Spanned endComp = Html.fromHtml(components[0]); - builder.append(taskSpan) - .append(' ') - .append(endComp); + htmlStringBuilder.append(comp); + htmlStringBuilder.append(' '); + } + } + + if (htmlStringBuilder.length() > 0) + builder.append(Html.fromHtml(htmlStringBuilder.toString())); + + return builder; + } + private static CharSequence getLinkSpan(final AstridActivity activity, Update update, String actionCode, String user, String targetName, + String message, String otherUser, String action, String linkColor, String linkType) { + if (TASK_LINK_TYPE.equals(linkType)) { + long taskId = update.getValue(Update.TASK_LOCAL); + if (taskId <= 0) { + Task local = PluginServices.getTaskService().fetchByRemoteId(update.getValue(Update.TASK), Task.ID); + if (local != null) + taskId = local.getId(); } - return builder; - } catch (PatternSyntaxException e) { - original = original.replace(TASK_LINK_TOKEN, targetNameLink); - return Html.fromHtml(original); + final long taskIdToUse = taskId; + + if (taskId > 0) { + SpannableString taskSpan = new SpannableString(targetName); + taskSpan.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + activity.onTaskListItemClicked(taskIdToUse); + } + }, 0, targetName.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + return taskSpan; + } else { + return Html.fromHtml(linkify(targetName, linkColor)); + } } + return null; } }