Skip to content
This repository was archived by the owner on Jul 25, 2024. It is now read-only.

Commit 2b392e4

Browse files
Sam1301kunall17
authored andcommitted
Fix inline code and code blocks formatting messages.
1 parent ad40f61 commit 2b392e4

File tree

3 files changed

+83
-8
lines changed

3 files changed

+83
-8
lines changed

app/src/main/java/com/zulip/android/activities/RecyclerMessageAdapter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import android.graphics.Bitmap;
99
import android.graphics.Color;
1010
import android.graphics.drawable.GradientDrawable;
11-
import android.net.Uri;
1211
import android.support.annotation.ColorInt;
1312
import android.support.v4.content.ContextCompat;
1413
import android.support.v4.view.ViewCompat;
@@ -34,6 +33,7 @@
3433
import com.zulip.android.models.MessageType;
3534
import com.zulip.android.models.Person;
3635
import com.zulip.android.models.Stream;
36+
import com.zulip.android.util.ConvertDpPx;
3737
import com.zulip.android.util.MutedTopics;
3838
import com.zulip.android.util.OnItemClickListener;
3939
import com.zulip.android.util.UrlHelper;
@@ -380,6 +380,9 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int pos
380380
messageHolder.contentView.setText(message.getFormattedContent(zulipApp));
381381
messageHolder.contentView.setMovementMethod(LinkMovementMethod.getInstance());
382382

383+
int padding = ConvertDpPx.convertDpToPixel(4);
384+
messageHolder.contentView.setShadowLayer(padding, 0, 0, 0);
385+
383386
final String url = message.extractImageUrl(zulipApp);
384387
if (url != null) {
385388
messageHolder.contentImageContainer.setVisibility(View.VISIBLE);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.zulip.android.util;
2+
3+
import android.content.res.Resources;
4+
import android.util.DisplayMetrics;
5+
6+
/**
7+
* This class is used during conversions between dp and px.
8+
*/
9+
10+
public class ConvertDpPx {
11+
12+
/**
13+
* This method converts dp unit to equivalent pixels, depending on device density.
14+
*
15+
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
16+
* @return A float value to represent px equivalent to dp depending on device density
17+
*/
18+
public static int convertDpToPixel(float dp){
19+
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
20+
float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
21+
return Math.round(px);
22+
}
23+
24+
/**
25+
* This method converts device specific pixels to density independent pixels.
26+
*
27+
* @param px A value in px (pixels) unit. Which we need to convert into db
28+
* @return A float value to represent dp equivalent to px value
29+
*/
30+
public static float convertPixelsToDp(float px){
31+
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
32+
float dp = px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
33+
return dp;
34+
}
35+
}

app/src/main/java/com/zulip/android/util/CustomHtmlToSpannedConverter.java

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import android.content.res.Resources;
2222
import android.graphics.Canvas;
2323
import android.graphics.Paint;
24+
import android.graphics.Rect;
2425
import android.graphics.Typeface;
2526
import android.graphics.drawable.Drawable;
2627
import android.support.annotation.NonNull;
@@ -31,8 +32,10 @@
3132
import android.text.SpannableStringBuilder;
3233
import android.text.Spanned;
3334
import android.text.TextUtils;
35+
import android.text.style.BackgroundColorSpan;
3436
import android.text.style.ForegroundColorSpan;
3537
import android.text.style.ImageSpan;
38+
import android.text.style.LineBackgroundSpan;
3639
import android.text.style.ParagraphStyle;
3740
import android.text.style.QuoteSpan;
3841
import android.text.style.RelativeSizeSpan;
@@ -45,6 +48,7 @@
4548
import android.text.style.URLSpan;
4649
import android.text.style.UnderlineSpan;
4750
import android.text.util.Linkify;
51+
import android.util.DisplayMetrics;
4852
import android.util.Pair;
4953

5054
import com.zulip.android.R;
@@ -66,8 +70,6 @@
6670
import java.util.List;
6771
import java.util.Locale;
6872

69-
import static android.R.attr.id;
70-
7173
public class CustomHtmlToSpannedConverter implements ContentHandler {
7274

7375
private static final float[] HEADER_SIZES = {1.5f, 1.4f, 1.3f, 1.2f, 1.1f,
@@ -84,6 +86,7 @@ public class CustomHtmlToSpannedConverter implements ContentHandler {
8486
private Html.TagHandler mTagHandler;
8587
private Html.ImageGetter mEmojiGetter;
8688
private String mBaseUri;
89+
private boolean isCode;
8790

8891
public CustomHtmlToSpannedConverter(String source,
8992
Html.ImageGetter imageGetter, Html.TagHandler tagHandler,
@@ -523,8 +526,10 @@ private void handleStartTag(String tag, Attributes attributes) {
523526
} else if (tag.equalsIgnoreCase("sub")) {
524527
start(mSpannableStringBuilder, new Sub());
525528
} else if (tag.equalsIgnoreCase("code")) {
529+
isCode = true;
526530
start(mSpannableStringBuilder, new InlineCode());
527531
} else if (tag.equalsIgnoreCase("pre")) {
532+
isCode = true;
528533
start(mSpannableStringBuilder, new CodeBlock());
529534
} else if (tag.equalsIgnoreCase("del")) {
530535
start(mSpannableStringBuilder, new StrikeThrough());
@@ -601,11 +606,17 @@ private void handleEndTag(String tag) {
601606
} else if (tag.equalsIgnoreCase("code")) {
602607
endMultiple(mSpannableStringBuilder, InlineCode.class,
603608
new Object[]{new TypefaceSpan(MONOSPACE),
604-
new ForegroundColorSpan(0xffdd1144) // pink
609+
new ForegroundColorSpan(0xffdd1144),
610+
new BackgroundColorSpan(0xfff7f7f9)
605611
});
612+
isCode = false;
606613
} else if (tag.equalsIgnoreCase("pre")) {
607-
end(mSpannableStringBuilder, CodeBlock.class, new TypefaceSpan(
608-
MONOSPACE));
614+
endMultiple(mSpannableStringBuilder, CodeBlock.class, new Object[]{
615+
new TypefaceSpan(MONOSPACE),
616+
new ForegroundColorSpan(0xff000000),
617+
new CodeBlockLine(0xfff5f5f5)
618+
});
619+
isCode = false;
609620
} else if (tag.equalsIgnoreCase("del")) {
610621
end(mSpannableStringBuilder, StrikeThrough.class, new StrikethroughSpan());
611622
} else if (tag.equalsIgnoreCase("s")) {
@@ -676,8 +687,14 @@ public void characters(char ch[], int start, int length)
676687
pred = sb.charAt(len - 1);
677688
}
678689

679-
if (pred != ' ' && pred != '\n') {
680-
sb.append(' ');
690+
if (!isCode) {
691+
if (pred != ' ' && pred != '\n') {
692+
sb.append(' ');
693+
}
694+
} else {
695+
if ((pred != ' ' && c == ' ') || (pred != '\n' && c == '\n')) {
696+
sb.append(c);
697+
}
681698
}
682699
} else {
683700
sb.append(c);
@@ -760,6 +777,26 @@ public Header(int level) {
760777
}
761778
}
762779

780+
private static class CodeBlockLine implements LineBackgroundSpan {
781+
private int fillColor;
782+
783+
public CodeBlockLine(int fillColor) {
784+
this.fillColor = fillColor;
785+
}
786+
787+
@Override
788+
public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline,
789+
int bottom, CharSequence text, int start, int end, int lnum) {
790+
int paddingInPx = ConvertDpPx.convertDpToPixel(12);
791+
Rect rect = new Rect(left - paddingInPx, top - paddingInPx,
792+
right + paddingInPx, bottom + paddingInPx);
793+
final int paintColor = p.getColor();
794+
p.setColor(this.fillColor);
795+
c.drawRect(rect, p);
796+
p.setColor(paintColor);
797+
}
798+
}
799+
763800
private class CustomQuoteSpan extends QuoteSpan {
764801
private static final int STRIPE_WIDTH = 10;
765802
private static final int GAP_WIDTH = 20;

0 commit comments

Comments
 (0)