From 07f85b14eca4af5543317193112e01d94f407c36 Mon Sep 17 00:00:00 2001 From: Katelyn Dickey Date: Tue, 3 Jan 2023 20:20:16 -0500 Subject: [PATCH 1/3] Convert new blog posts to HTML. Web URLs are converted to real links and newlines are preserved. --- .../briar/android/blog/WriteBlogPostActivity.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java index 4c4b36d33..a24761752 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java @@ -2,6 +2,9 @@ package org.briarproject.briar.android.blog; import android.content.Intent; import android.os.Bundle; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.util.Linkify; import android.view.MenuItem; import android.widget.ProgressBar; @@ -123,7 +126,11 @@ public class WriteBlogPostActivity extends BriarActivity input.setVisibility(GONE); progressBar.setVisibility(VISIBLE); - storePost(text); + SpannableStringBuilder ssb = SpannableStringBuilder.valueOf(text); + Linkify.addLinks(ssb, Linkify.WEB_URLS); + String html = Html.toHtml(ssb); + + storePost(html); return new MutableLiveData<>(SENT); } From 1c1c6096b5c0532f136865bb4119cddff2a20e4f Mon Sep 17 00:00:00 2001 From: Katelyn Dickey Date: Fri, 6 Jan 2023 13:01:08 -0500 Subject: [PATCH 2/3] Handle generated html that exceeds the maximum text length. Also improve rendering. --- .../android/blog/BlogPostViewHolder.java | 5 +++- .../android/blog/WriteBlogPostActivity.java | 24 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java index 40da368f8..c44557aad 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java @@ -18,6 +18,7 @@ import org.briarproject.briar.api.blog.BlogPostHeader; import org.briarproject.nullsafety.NotNullByDefault; import androidx.annotation.UiThread; +import androidx.core.text.HtmlCompat; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.RecyclerView; @@ -106,7 +107,9 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder { } // post text - Spanned postText = getSpanned(item.getText()); + String rawText = item.getText() != null ? item.getText() : ""; + Spanned postText = item.isRssFeed() ? getSpanned(rawText) : + HtmlCompat.fromHtml(rawText, HtmlCompat.FROM_HTML_MODE_COMPACT); if (fullText) { text.setText(postText); text.setTextIsSelectable(true); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java index a24761752..b8058d2ca 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java @@ -2,17 +2,19 @@ package org.briarproject.briar.android.blog; import android.content.Intent; import android.os.Bundle; -import android.text.Html; import android.text.SpannableStringBuilder; import android.text.util.Linkify; import android.view.MenuItem; import android.widget.ProgressBar; +import com.google.android.material.snackbar.Snackbar; + import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -24,6 +26,7 @@ import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogPost; import org.briarproject.briar.api.blog.BlogPostFactory; +import org.briarproject.briar.util.HtmlUtils; import org.briarproject.nullsafety.MethodsNotNullByDefault; import org.briarproject.nullsafety.ParametersNotNullByDefault; @@ -34,11 +37,13 @@ import java.util.logging.Logger; import javax.inject.Inject; import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; @@ -121,15 +126,24 @@ public class WriteBlogPostActivity extends BriarActivity List headers, long expectedAutoDeleteTimer) { if (isNullOrEmpty(text)) throw new AssertionError(); + SpannableStringBuilder ssb = SpannableStringBuilder.valueOf(text); + Linkify.addLinks(ssb, Linkify.WEB_URLS); + String html = HtmlUtils.clean( + HtmlCompat.toHtml(ssb, + HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL), + HtmlUtils.ARTICLE); + + int textLength = StringUtils.toUtf8(html).length; + if (textLength > MAX_BLOG_POST_TEXT_LENGTH) { + Snackbar.make(input, R.string.text_too_long, LENGTH_SHORT).show(); + return new MutableLiveData<>(null); + } + // hide publish button, show progress bar input.hideSoftKeyboard(); input.setVisibility(GONE); progressBar.setVisibility(VISIBLE); - SpannableStringBuilder ssb = SpannableStringBuilder.valueOf(text); - Linkify.addLinks(ssb, Linkify.WEB_URLS); - String html = Html.toHtml(ssb); - storePost(html); return new MutableLiveData<>(SENT); } From d56d634cc13686e196c6ff82bd89739526921db6 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sat, 25 Oct 2025 13:47:45 +0100 Subject: [PATCH 3/3] Update method name, remove redundant HTML conversion. --- .../android/blog/BlogPostViewHolder.java | 5 +---- .../android/blog/WriteBlogPostActivity.java | 20 +++++++++---------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java index c44557aad..40da368f8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java @@ -18,7 +18,6 @@ import org.briarproject.briar.api.blog.BlogPostHeader; import org.briarproject.nullsafety.NotNullByDefault; import androidx.annotation.UiThread; -import androidx.core.text.HtmlCompat; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.RecyclerView; @@ -107,9 +106,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder { } // post text - String rawText = item.getText() != null ? item.getText() : ""; - Spanned postText = item.isRssFeed() ? getSpanned(rawText) : - HtmlCompat.fromHtml(rawText, HtmlCompat.FROM_HTML_MODE_COMPACT); + Spanned postText = getSpanned(item.getText()); if (fullText) { text.setText(postText); text.setTextIsSelectable(true); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java index b8058d2ca..af334f003 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/WriteBlogPostActivity.java @@ -3,7 +3,6 @@ package org.briarproject.briar.android.blog; import android.content.Intent; import android.os.Bundle; import android.text.SpannableStringBuilder; -import android.text.util.Linkify; import android.view.MenuItem; import android.widget.ProgressBar; @@ -14,7 +13,6 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.sync.GroupId; -import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -26,7 +24,6 @@ import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogPost; import org.briarproject.briar.api.blog.BlogPostFactory; -import org.briarproject.briar.util.HtmlUtils; import org.briarproject.nullsafety.MethodsNotNullByDefault; import org.briarproject.nullsafety.ParametersNotNullByDefault; @@ -37,19 +34,24 @@ import java.util.logging.Logger; import javax.inject.Inject; import androidx.annotation.Nullable; -import androidx.core.text.HtmlCompat; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import static android.text.util.Linkify.WEB_URLS; +import static android.text.util.Linkify.addLinks; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static androidx.core.text.HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL; +import static androidx.core.text.HtmlCompat.toHtml; import static com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; +import static org.briarproject.bramble.util.StringUtils.toUtf8; import static org.briarproject.briar.android.view.TextSendController.SendState; import static org.briarproject.briar.android.view.TextSendController.SendState.SENT; import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH; +import static org.briarproject.briar.util.HtmlUtils.cleanArticle; @MethodsNotNullByDefault @ParametersNotNullByDefault @@ -127,13 +129,11 @@ public class WriteBlogPostActivity extends BriarActivity if (isNullOrEmpty(text)) throw new AssertionError(); SpannableStringBuilder ssb = SpannableStringBuilder.valueOf(text); - Linkify.addLinks(ssb, Linkify.WEB_URLS); - String html = HtmlUtils.clean( - HtmlCompat.toHtml(ssb, - HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL), - HtmlUtils.ARTICLE); + addLinks(ssb, WEB_URLS); + String html = cleanArticle(toHtml(ssb, + TO_HTML_PARAGRAPH_LINES_INDIVIDUAL)); - int textLength = StringUtils.toUtf8(html).length; + int textLength = toUtf8(html).length; if (textLength > MAX_BLOG_POST_TEXT_LENGTH) { Snackbar.make(input, R.string.text_too_long, LENGTH_SHORT).show(); return new MutableLiveData<>(null);