Skip to content

Commit 0391655

Browse files
authored
Add systraces on Android (#565)
1 parent 9ad0acd commit 0391655

File tree

3 files changed

+80
-45
lines changed

3 files changed

+80
-45
lines changed

android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import com.expensify.livemarkdown.spans.*;
1010
import com.facebook.react.views.text.internal.span.CustomLineHeightSpan;
11+
import com.facebook.systrace.Systrace;
1112

1213
import java.util.List;
1314
import java.util.Objects;
@@ -20,22 +21,37 @@ public MarkdownFormatter(@NonNull AssetManager assetManager) {
2021
}
2122

2223
public void format(SpannableStringBuilder ssb, List<MarkdownRange> markdownRanges, @NonNull MarkdownStyle markdownStyle) {
23-
Objects.requireNonNull(markdownStyle, "mMarkdownStyle is null");
24-
removeSpans(ssb);
25-
applyRanges(ssb, markdownRanges, markdownStyle);
24+
try {
25+
Systrace.beginSection(0, "format");
26+
Objects.requireNonNull(markdownStyle, "mMarkdownStyle is null");
27+
removeSpans(ssb);
28+
applyRanges(ssb, markdownRanges, markdownStyle);
29+
} finally {
30+
Systrace.endSection(0);
31+
}
2632
}
2733

2834
private void removeSpans(SpannableStringBuilder ssb) {
29-
// We shouldn't use `removeSpans()` because it also removes SpellcheckSpan, SuggestionSpan etc.
30-
MarkdownSpan[] spans = ssb.getSpans(0, ssb.length(), MarkdownSpan.class);
31-
for (MarkdownSpan span : spans) {
32-
ssb.removeSpan(span);
35+
try {
36+
Systrace.beginSection(0, "removeSpans");
37+
// We shouldn't use `removeSpans()` because it also removes SpellcheckSpan, SuggestionSpan etc.
38+
MarkdownSpan[] spans = ssb.getSpans(0, ssb.length(), MarkdownSpan.class);
39+
for (MarkdownSpan span : spans) {
40+
ssb.removeSpan(span);
41+
}
42+
} finally {
43+
Systrace.endSection(0);
3344
}
3445
}
3546

3647
private void applyRanges(SpannableStringBuilder ssb, List<MarkdownRange> markdownRanges, @NonNull MarkdownStyle markdownStyle) {
37-
for (MarkdownRange markdownRange : markdownRanges) {
38-
applyRange(ssb, markdownRange, markdownStyle);
48+
try {
49+
Systrace.beginSection(0, "applyRanges");
50+
for (MarkdownRange markdownRange : markdownRanges) {
51+
applyRange(ssb, markdownRange, markdownStyle);
52+
}
53+
} finally {
54+
Systrace.endSection(0);
3955
}
4056
}
4157

android/src/main/java/com/expensify/livemarkdown/MarkdownParser.java

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.facebook.react.bridge.ReactContext;
66
import com.facebook.react.util.RNLog;
77
import com.facebook.soloader.SoLoader;
8+
import com.facebook.systrace.Systrace;
89

910
import org.json.JSONArray;
1011
import org.json.JSONException;
@@ -31,46 +32,58 @@ public MarkdownParser(@NonNull ReactContext reactContext) {
3132
private native String nativeParse(String text, int parserId);
3233

3334
public synchronized List<MarkdownRange> parse(String text, int parserId) {
34-
if (text.equals(mPrevText) && parserId == mPrevParserId) {
35-
return mPrevMarkdownRanges;
36-
}
37-
38-
String json;
3935
try {
40-
json = nativeParse(text, parserId);
41-
} catch (Exception e) {
42-
// Skip formatting, runGuarded will show the error in LogBox
43-
mPrevText = text;
44-
mPrevParserId = parserId;
45-
mPrevMarkdownRanges = Collections.emptyList();
46-
return mPrevMarkdownRanges;
47-
}
36+
Systrace.beginSection(0, "parse");
4837

49-
List<MarkdownRange> markdownRanges = new LinkedList<>();
50-
try {
51-
JSONArray ranges = new JSONArray(json);
52-
for (int i = 0; i < ranges.length(); i++) {
53-
JSONObject range = ranges.getJSONObject(i);
54-
String type = range.getString("type");
55-
int start = range.getInt("start");
56-
int length = range.getInt("length");
57-
int depth = range.optInt("depth", 1);
58-
if (length == 0 || start + length > text.length()) {
59-
continue;
38+
if (text.equals(mPrevText) && parserId == mPrevParserId) {
39+
return mPrevMarkdownRanges;
40+
}
41+
42+
String json;
43+
try {
44+
Systrace.beginSection(0, "nativeParse");
45+
json = nativeParse(text, parserId);
46+
} catch (Exception e) {
47+
// Skip formatting, runGuarded will show the error in LogBox
48+
mPrevText = text;
49+
mPrevParserId = parserId;
50+
mPrevMarkdownRanges = Collections.emptyList();
51+
return mPrevMarkdownRanges;
52+
} finally {
53+
Systrace.endSection(0);
54+
}
55+
56+
List<MarkdownRange> markdownRanges = new LinkedList<>();
57+
try {
58+
Systrace.beginSection(0, "markdownRanges");
59+
JSONArray ranges = new JSONArray(json);
60+
for (int i = 0; i < ranges.length(); i++) {
61+
JSONObject range = ranges.getJSONObject(i);
62+
String type = range.getString("type");
63+
int start = range.getInt("start");
64+
int length = range.getInt("length");
65+
int depth = range.optInt("depth", 1);
66+
if (length == 0 || start + length > text.length()) {
67+
continue;
68+
}
69+
markdownRanges.add(new MarkdownRange(type, start, length, depth));
6070
}
61-
markdownRanges.add(new MarkdownRange(type, start, length, depth));
71+
} catch (JSONException e) {
72+
RNLog.w(mReactContext, "[react-native-live-markdown] Incorrect schema of worklet parser output: " + e.getMessage());
73+
mPrevText = text;
74+
mPrevParserId = parserId;
75+
mPrevMarkdownRanges = Collections.emptyList();
76+
return mPrevMarkdownRanges;
77+
} finally {
78+
Systrace.endSection(0);
6279
}
63-
} catch (JSONException e) {
64-
RNLog.w(mReactContext, "[react-native-live-markdown] Incorrect schema of worklet parser output: " + e.getMessage());
80+
6581
mPrevText = text;
6682
mPrevParserId = parserId;
67-
mPrevMarkdownRanges = Collections.emptyList();
83+
mPrevMarkdownRanges = markdownRanges;
6884
return mPrevMarkdownRanges;
85+
} finally {
86+
Systrace.endSection(0);
6987
}
70-
71-
mPrevText = text;
72-
mPrevParserId = parserId;
73-
mPrevMarkdownRanges = markdownRanges;
74-
return mPrevMarkdownRanges;
7588
}
7689
}

android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import androidx.annotation.NonNull;
66

77
import com.facebook.react.bridge.ReactContext;
8+
import com.facebook.systrace.Systrace;
89

910
import java.util.List;
1011

@@ -29,8 +30,13 @@ public void setParserId(int parserId) {
2930
}
3031

3132
public void applyMarkdownFormatting(SpannableStringBuilder ssb) {
32-
String text = ssb.toString();
33-
List<MarkdownRange> markdownRanges = mMarkdownParser.parse(text, mParserId);
34-
mMarkdownFormatter.format(ssb, markdownRanges, mMarkdownStyle);
33+
try {
34+
Systrace.beginSection(0, "applyMarkdownFormatting");
35+
String text = ssb.toString();
36+
List<MarkdownRange> markdownRanges = mMarkdownParser.parse(text, mParserId);
37+
mMarkdownFormatter.format(ssb, markdownRanges, mMarkdownStyle);
38+
} finally {
39+
Systrace.endSection(0);
40+
}
3541
}
3642
}

0 commit comments

Comments
 (0)